date: 2020-06-29title: nginx location匹配规则 #标题
tags: nginx匹配规则 #标签
categories: nginx # 分类
location匹配
location [=|~|~*|^~|@] /uri/ {
...
}
- =:表示精确匹配后面的url;
- ~:表示正则匹配,但是区分大小写;
- ~*:表示正则匹配,不区分大小写;
- ^~:表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配其他选项,一般用于匹配目录;
- @:“@”定义一个命名的location,使用在内部定向时,例如 error_page。这样的location不用于常规请求处理,而是用于请求重定向。
上述匹配规则的优先匹配顺序:
- =前缀的指令严格匹配这个查询。如果找到,则停止搜索。
- [空格] 前缀匹配,匹配后,继续更长前缀匹配和正则匹配。
- ^~ 非正则匹配,匹配该规则后,停止继续正则匹配。
- ~ 区分大小写的正则匹配,按顺序匹配,一旦匹配上即停止后续匹配。
- ~* 不区分大小写的匹配,一旦匹配即停止后续匹配。
url匹配
在nginx中配置proxy_pass时,当在后面url加上了/,相当于时绝对根路径,则nginx不会把location中匹配的路径部分给代理走,如果没有/,则会把匹配的路径部分也给代理走。
模糊匹配
没有/
时,localtion /ljz/test
可以匹配/ljz/test
请求,也可以匹配/ljz/test/xxx
等。
而有/
时,localtion /ljz/test/
不能匹配/ljz/test
请求,只能匹配/ljz/test/xxx
这样的请求。
匹配举例
访问url如下:
$ http://192.168.20.3/proxy/test.html
第一种location规则
location /proxy/ {
set $X_test 'match location'; # 稍后我会解释这个set指令
proxy_pass http://192.168.20.3/;
}
按照上述配置会代理到:http://192.168.20.3/test.html。
第二种location规则
# 此规则比起第一个来,最后少了个 /
location /proxy/ {
set $X_test 'match location';
proxy_pass http://192.168.20.3;
}
此规则会代理到:http://192.168.20.3/proxy/test.html。
第三种规则匹配
location /proxy/ {
set $X_test 'match location';
proxy_pass http://192.168.20.3/merchant/;
}
此规则会代理到:http://192.168.20.3/merchant/test.html。
第四种规则匹配
location /proxy/ {
set $X_test 'match location';
proxy_pass http://192.168.20.3/merchant;
}
# 相对于第三种,最后少一个/。
此规则会代理到:http://192.168.20.3/merchanttest.html。
location调试技巧——set
set指令在nginx中是用来设置变量的,在我们进行location规则匹配调试时,可以借助set指令来帮助我们。使用方法如下:
location /proxy { # 设置$X_test的值为'match location'
set $X_test 'match location'; # 在location规则中设置set指令
proxy_pass http://192.168.20.3/merchant;
}
# 设置访问日志格式记录set的变量值:
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" location: "$X_test"';
# 在日志格式中添加:location: "$X_test"',以便记录此变量的值
如果url匹配到此location规则,那么X_test
的值就会是我们设置的值match location
,如果没有则日志中记录的X_test
就会为空值。
如下所示,分别为匹配和没有匹配时,日志所记录的内容:
你get到了么?
参考: