一直对nginx的location匹配顺序处于一种似懂非懂的状态,这次仔细阅读了官方文档后顿悟了,做此纪录。
location
参考:location
location的匹配模式有五种:
location /abc{ #普通前缀匹配
...
}
location ^~ /abc{ #不做正则的普通前缀匹配
...
}
location = /abc{ #精准匹配
...
}
location ~ /abc{ #大小写敏感的正则匹配
...
}
location ~* /abc{ #大小写不敏感的正则匹配
...
}
具体的匹配顺序:
- 从上往下挨个匹配,满足
location = /xxx
则结束匹配 - 尝试普通前缀匹配,记录匹配度最高的location,如果是
^~
模式的结束匹配,不是则不会结束匹配,继续第三步 - 再次从上往下尝试正则匹配,选择第一个匹配成功的location,没有找到匹配的正则location,选择第二步记录的location
正则匹配的注意项
location ~ /abc{
...
}
这样一个正则匹配并不等同于location /abc这样的前缀匹配,它其实是一个contain的效果,只要目标url中包含"/abc"这样的部分就会被该location匹配上。
例如:/test/abc/test或者/test/abcd/test都会被该location匹配上
root和alias
location /aaa/bbb/ {
...
}
如果把/aaa/bbb/
定义为uri根路径,那么使用root会在document path后面加上uri根路径,而alias不会。
proxy_pass
参考:proxy_pass
location /abc/ {
proxy_pass http://ip:port[URI];
}
这里的proxy_pass是ngx_http_proxy_module模块里的,要求后面跟上一个URL,协议可选http或https,最后面的URI可选。
如果把/abc/
部分定义为原始uri根路径,那么proxy_pass就分为自带uri和不带uri俩种情况:
- 自带uri的,例如
proxy_pass http://ip:port/abc/
,会用自带的uri替换原始uri根路径 - 不带uri的,例如
proxy_pass http://ip:port
,会使用完整的原始uri
举几个简单的例子:
原始访问地址:http://129.1.1.1/abc/a.html 进行访问。
location /abc/ {
proxy_pass http://127.0.0.1/;
}
原始uri根路径'/abc/',自带的uri是'/', 代理URL:http://127.0.0.1/a.html
location /abc/ {
proxy_pass http://127.0.0.1;
}
不自带uri,代理URL:http://127.0.0.1/abc/a.html
location /abc/ {
proxy_pass http://127.0.0.1/qqq/;
}
原始uri根路径'/abc/',自带uri是'/qqq/',代理URL:http://127.0.0.1/qqq/a.html