Nginx配置中Location的优先级

根据Nginx的官方文档,Location标签一共有四个修饰符,分别是:

(1) =:表示完全匹配;

(2) ^~:匹配URI的前缀,并且后面的正则表达式不再匹配,如果一个URI同时满足两个规则的话,匹配最长的规则;

(3) ~:匹配正则表达式,大小写敏感;

(4) ~*:匹配正则表达式,大小写不敏感;

优先级:(1)> (2) > (3) = (4)

就是完全匹配=的优先级是最高的,其次是^~,最后就是正则表达式的匹配。

换言之,一个URI请求首先检查是否符合=的规则,如果符合就直接返回结果,否则继续匹配^~的规则,如果^~规则不匹配,那么就匹配~~*,正则匹配的先后顺序是:在配置文件中先出现的先匹配,匹配成功就不再匹配后面的正则表达式。

注意:即使是在~~*同时出现的情况,仍然按照出现的顺序进行匹配。

例子:

location ~ /.*\.php {
	root /var/www/html/php;
	include snippets/fastcgi-php.conf;
	fastcgi_pass unix:/run/php/php7.3-fpm.sock;
}
location ~* /ddd.*\.php {
	root /var/www/html;
	include snippets/fastcgi-php.conf;
	fastcgi_pass unix:/run/php/php7.3-fpm.sock;
}

我们尝试访问http://192.168.1.128/ddd.php,那么实际上读取的是/var/www/html/php/ddd.php。虽然两个规则都是匹配的,但是第一个规则出现在先,所以第一个规则优先匹配,读取的是/var/www/html/php/ddd.php

最后,如果上面的四个规则都不匹配,那么就是直接匹配URI的前缀,譬如:location /abc.php

参考文献:

http://nginx.org/en/docs/http/ngx_http_core_module.html#location

https://www.bo56.com/nginx-location在配置中的优先级/

posted @ 2018-11-22 00:07  cloes  阅读(114)  评论(0编辑  收藏  举报