rewrite规则写在location ~ .php$里会失效,因其被php location块截获而终止匹配;正确做法是将rewrite置于server顶层或location /内,并用try_files替代if判断以避免循环和性能问题。

rewrite 规则写在 location ~ \.php$ 里会失效
这是最常被忽略的配置位置错误。Nginx 的 location ~ \.php$ 块专门处理 PHP 请求,一旦请求匹配到这里,后续的 rewrite 就不会再执行——它已经被“截胡”了。
常见现象是:首页能打开,但分页、搜索、后台路由全部 404 或跳转失败。
- 必须把
rewrite规则放在server块顶层(即所有location外),或放在通用location /块里 - 不要复制 Apache 的
.htaccess写法直接粘贴进宝塔伪静态框,Nginx 不支持RewriteRule语法 - 用
try_files替代if (!-e $request_filename)更安全,后者在高并发下有性能隐患且易触发重定向循环
WordPress 启用固定链接后出现重定向循环
本质是 rewrite 没终止在 index.php,而是反复重写自身,比如 /page/2/ → /index.php/page/2/ → /index.php/index.php/page/2/……
关键检查点:
- 确认伪静态规则末尾用了
last(不是break或缺省),否则重写后会重新进入 location 匹配流程 - 删掉网站根目录残留的
.htaccess文件,它和 Nginx 规则共存时可能干扰判断 - 检查宝塔「网站设置 → 配置文件」里是否重复插入了两段 rewrite —— 有人手动加了一次,又点了「伪静态 → wordpress」模板再保存,导致规则叠加
ThinkPHP/Laravel 子目录部署时 rewrite 跳转错路径
子目录部署(如 https://a.com/app/)下,location / 默认匹配根路径,所有 rewrite 都从 / 开始算,结果把 /app/api 当成 /api 处理,最终指向错误的 index.php 位置。
正确做法:
- 把
location /改为location /app/(注意结尾斜杠) -
try_files第二参数要带前缀:try_files $uri $uri/ /app/index.php?$query_string; - ThinkPHP 6 的 PATH_INFO 模式还需确认宝塔 PHP 设置中没禁用
putenv,否则$_SERVER['PATH_INFO']为空,路由解析失败
重载配置后仍循环?快看 nginx_error.log
别猜,直接查日志。循环重定向在 Nginx 层会留下明确痕迹:
运行 tail -f /www/wwwlogs/nginx_error.log | grep "rewrite or internal redirection cycle",只要看到这行,说明某条 rewrite 正在自我嵌套。
- 典型诱因:
rewrite ^/(.*)$ /index.php/$1 last;这种无条件通配,当/index.php/xxx再次被匹配,就会无限追加 - 修复方向:加存在性判断,例如
try_files $uri $uri/ /index.php?$query_string;,它只在文件/目录不存在时才 fallback - 注意:改完规则后必须点「保存」+ 右上角「重载配置」,不是「重启 Nginx」;后者可能加载旧缓存配置
nginx_error.log 里的那句报错,它永远比面板开关更诚实。











