转自:https://blog.csdn.net/tzy233/article/details/79780444
Nginx是反向代理和负载均衡的首选工具,nginx的location配置有许多细节内容在网上不容易找到资料,或者解释不清。本文对locaiton的常见特性进行介绍。
location的优先级 locaiton有四种类型的匹配规则,分别为完全匹配(=)、前缀普通匹配(^~)、正则表达式匹配(~或者~*)、普通匹配
规则
等号类型(=)的优先级最高。一旦匹配成功,则不再查找其他匹配项 前缀普通匹配(^~)优先级次之。不支持正则表达式。使用前缀匹配,如果有多个location匹配的话,则使用表达式最长的那个 正则表达式类型(~ ~*)的优先级次之。一旦匹配成功,则不再查找其他匹配项 常规字符串匹配,如果有多个location匹配的话,则使用表达式最长的那个 说明
先判断精准命中,如果命中,立即返回结果并结束解析过程 若未结束,判断前缀普通命中,如果有多个命中,使用表达式“最长”的命中结果,结束解析过程 若未结束,继续判断正则表达式的匹配,按正则表达式顺序为准,由上至下一旦匹配成功1个,立即返回结果,并结束解析过程 若未结束,继续普通命中,普通命中和前缀普通命中相似,顺序无所谓,按照location表达式的长短来确定命中结果 “最长”命中
^~和普通命中,都是优先使用匹配最长的结果,示例如下:
location ^~ /a { root /; } location ^~ /aaa { root /aaa; } 如果url为/aaa,则上面两个location都匹配成功,但用于location ^~ /aaa较长,所以最终会以/aaa作为root
上例中如果是普通匹配(把location的^~去掉),结果也是一样的
路径替换 规则
配置proxy_pass时,可以实现URL路径的部分替换。
proxy_pass的目标地址,默认不带/,表示只代理域名,url和querystring部分不会变(把请求的path拼接到proxy_pass目标域名之后作为代理的URL)
如果在目标地址后增加/,则表示把path中location匹配成功的部分剪切掉之后再拼接到proxy_pass目标地址
比如请求 /a/b.html
location /a { proxy_pass http://server; } location /a { proxy_pass http://server/; } 如上两个匹配成功后,实际代理的目标url分别是
http://server/a/b.html (把/a/b.html拼接到http://server之后)
http://server/b.html (把/a/b.html的/a去掉之后,拼接到http://server/之后)
要求
注意的是,对于location为正则表达式的匹配,proxy_pass的目标地址不可以带/
比如,如下配置会报错:
location ~ /abc(.*) { proxy_pass http://127.0.0.1/x; } 正则表达式的替换
如果是正则表达式,想要实现proxy_pass的路径替换,可以使用如下方式:
location ~ /abc(.*) { # 注意,使用这种方式,location内部不能包含if语句,否则proxy_pass不会生效 proxy_pass http://127.0.0.1/x$1; } 如上可以把(.*)所匹配的内容拼接到http://127.0.0.1/abc之后,关于$1的使用,可以参考各种编程语言的正则表达式
另一种方法是:
location /abc { # 这里也可以是正则 proxy_pass http://127.0.0.1/x$request_uri; } |