Nginx的location匹配指令及常用内置变量

1070 查看

有如下指令语法可使用

~    #区分大小写的正则匹配

~*   #不区分大小写的正则匹配

^~   #普通字符匹配,如果此选项匹配成功,忽略其他匹配选项,一般用来匹配目录

=    #普通字符精确匹配

@    #定义一个内部命名的匹配,适用于error_page,try_files

匹配执行顺序及优先级:


- = 精确匹配
精确匹配会第一个被处理,如果精确匹配成功,停止搜索其他匹配模式,直接使用精确匹配
- 普通字符(/download,/img, ^~ /log,)
如果有前缀 ^~,且匹配此规则, 那么停止搜索其他规则,使用此规则
没有前缀 ^~,那么继续搜索正则匹配或者更长的普通字符匹配,如果发现正则匹配或者更长匹配,则使用正则或者更长匹配
- ~*
正则匹配被最后处理,匹配成功则使用此规则,否则使用其他匹配结果

实例

location  = / {
  # 只匹配"/".
  [ configuration A ] 
}
location  / {
  # 匹配任何请求,因为所有请求都是以"/"开始
  # 但是更长字符匹配或者正则表达式匹配会覆盖此匹配
  [ configuration B ] 
}
location ^~ /images/ {
  # 匹配任何以 /images/ 开始的请求,并停止匹配 其它location
  [ configuration C ] 
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配以 gif, jpg, or jpeg结尾的请求. 
  # 但是所有 /images/ 目录的请求将由 [Configuration C]处理.   
  [ configuration D ] 
}

请求URI例子:

#符合 configuration A
/ 
#符合 configuration B
/documents/document.html
#符合 configuration C    
/images/1.gif
#符合 configuration D
/documents/1.jpg

@location 例子

error_page 404 = @fetch;
location @fetch(
    proxy_pass http://fetch;
)

常见内部变量(如果发现更重要的会继续补充)


- $args 请求参数
例如: http://segmentfault.com/?test=test
那么 $args的值就是 test=test
- $uri 不带host(域名)的请求路径
例如: http://segmentfault.com/write
$uri 的值是 write