根据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