Nginx location 匹配规则没搞懂,改配置全靠猜?一张优先级表讲透

来源:互联网 时间:2026-08-28

很多站长第一次给网站加规则就翻车:明明写了 location /admin/ 的限制,访问 /admin/login.php 却没生效;或者想给图片加缓存头,结果整个站都被匹配走了。问题不在 Nginx,在于 location 的匹配顺序跟你想象的完全不一样。

先记住一个反直觉的点:location 不是从上到下按顺序匹配的。Nginx 先看前缀匹配,再在所有前缀里挑最长的那个,精确匹配和正则又有各自的优先级。规则说清楚其实就四条。

location = /login.php { } # 精确匹配,优先级最高
location ^~ /static/ { } # 前缀匹配后不再查正则
location ~ \.php$ { } # 正则匹配,区分大小写
location ~* \.(jpg|png)$ { } # 正则匹配,不区分大小写
location / { } # 普通前缀,兜底

实际匹配流程是:先看有没有 = 精确命中,命中直接用;没有就记住最长的普通前缀匹配,如果它带 ^~ 就直接采用、不再看正则;否则去按配置文件里的出现顺序逐个试正则,第一个命中的生效;正则全军覆没,才回头用刚才记住的最长前缀。

举个站长最常见的坑:你想让 /static/ 下的静态文件不走 PHP 处理,写了 location ~ \.php$ 转发给 php-fpm,又写了 location /static/ 直接返回文件。结果 /static/test.php 还是进了 php-fpm——因为普通前缀干不过正则。改成 location ^~ /static/ 就好了,^~ 的意思就是命中后别再看正则。

验证方法很简单,改完配置先 nginx -t 测语法,再用 curl -v 加上 Host 头去试不同路径,看响应头里的 Content-Type 和 X-Cache 之类的标记,确认请求真的进了你想去的那个块。别改完就 reload,出错了连回退的机会都没有。

我的习惯是把精确匹配放最前面,正则块集中放中间并按业务重要性排序(第一个命中就停),普通前缀放最后兜底。另外同一家站的正则规则别写两遍相似的,Nginx 不会告诉你哪条生效了,出问题只能靠 curl 一步步试。

数据来源:Nginx官方文档 ngx_http_core_module location指令说明

相关文章

A5创业网 版权所有

返回顶部