nginx链接重写失败常因正则大小写敏感导致,应将~改为~实现不区分大小写匹配,如location ~ ^/php/或if ($request_uri ~* ^/php/),并可通过临时return规则快速验证。

遇到部分链接没被重写,很可能是正则匹配时大小写不一致导致的。Nginx 默认区分大小写,而用户访问 URL 时大小写随意(比如 /PHP/、/php/、/Php/),但你的规则只写了 ~ /php/,那就只能匹配小写的 php。
确认是否是大小写问题
先看日志里有没有匹配失败的请求,再检查 rewrite 规则用的是 ~ 还是 ~*:
-
~表示区分大小写匹配 ——^/php/不会匹配/PHP/ -
~*表示不区分大小写匹配 ——^/php/能匹配/php/、/PHP/、/Php/等任意大小写组合 - 如果 location 或 if 中用了
~,但实际路径大小写不固定,就容易漏掉请求
检查 rewrite 和 if 中的正则写法
常见出错位置有两个:
-
rewrite 指令本身不带匹配符号:它默认就是按 PCRE 正则解析,但大小写行为取决于你写的模式(如
^/php/是纯文本匹配,本质区分大小写);要让它不区分,得靠~*配合 if,或直接在 rewrite 的 pattern 里用[pP][hH][pP]—— 但更推荐用 if +~* -
if 判断中用了
~却没考虑大小写:比如if ($request_uri ~ ^/php/)→ 改成if ($request_uri ~* ^/php/)
快速验证和修复方法
不用重启,加一条临时 debug 规则就能看出问题:
- 在对应 server 或 location 块里加:
if ($request_uri ~* ^/.*php.*/){return 200 "matched: $request_uri";} - 用 curl 或浏览器访问各种大小写组合的 URL(如
/PHP/xxx、/php/xxx),看是否都返回成功响应 - 如果只有小写能触发,说明原规则确实缺
*;统一把~换成~*即可
避免后续踩坑的写法建议
除非业务明确要求区分大小写(如 API 版本号 /v1/ 和 /V1/ 不同),否则默认用不区分大小写:
- location 匹配路径时,优先用
location ~* ^/php/而不是location ~ ^/php/ - if 条件判断变量时,一律用
~*或!~* - rewrite 本身不支持直接加修饰符,所以依赖外层 if 或 location 的匹配结果来控制执行逻辑











