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