location块里rewrite规则404,因规则未置于真正处理请求的location中;ThinkPHP需确保重写后能进入PHP处理流程,必须加last标志并正确配置fastcgi_param。

为什么 location 块里写 rewrite 规则却 404?
宝塔面板里 Nginx 伪静态规则不生效,最常见的原因是规则没落在真正处理请求的 location 块中。ThinkPHP 默认依赖 index.php 入口,而宝塔新建站点时默认的配置里,location / 是直接 try_files 的,根本不会进你写的 rewrite —— 它早就在前面匹配并返回 404 或直接丢给静态文件了。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 打开站点配置文件(
/www/server/panel/vhost/nginx/xxx.conf),找到location /块,不要在里面加rewrite; - 把伪静态规则挪到
location ~ \.php$上方、且在location /内部的try_files之前; - 更稳妥的做法:新增一个
location /块(确保它在所有其他location之前),里面只放 ThinkPHP 的重写逻辑; - 必须加
last标志,否则 rewrite 后不会重新匹配 location,导致进不了 PHP 处理流程。
ThinkPHP 6/8 的伪静态规则和 Nginx 配置差异
ThinkPHP 不同版本对 PATH_INFO 的依赖方式不同,直接影响 Nginx 配置写法。TP6 默认用 pathinfo 模式,但 Nginx 默认不传 PATH_INFO 环境变量,光靠 rewrite 不够。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- TP6+ 推荐关闭
pathinfo,改用compat模式(在config/app.php中设'url_pathinfo_depr' => '/'并开启'url_route_must' => true); - 对应 Nginx 规则应为:
if (!-e $request_filename) {<br> rewrite ^(.*)$ /index.php?s=$1 last;<br>}; - 若坚持用 pathinfo,必须在
fastcgi_params中补全:fastcgi_param PATH_INFO $fastcgi_path_info;
,且确保location ~ \.php中有fastcgi_split_path_info解析; - TP8 默认已弃用 PATH_INFO,只认
s=参数,所以规则反而更简单,但必须确认入口文件是index.php而非public/index.php(后者需调整 root 路径)。
宝塔「伪静态」选项卡填的内容到底起什么作用?
宝塔后台「网站」→「设置」→「伪静态」里粘贴的那段内容,本质是插入到站点配置的 server 块里、location / 外部的一个独立 location ~ \.php$ 上方的代码块。它**不是全局生效**,也不参与 location 匹配优先级计算,只是“原样插入”。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 这里只适合放最简 rewrite,比如
rewrite ^(.*)$ /index.php?s=$1;; - 如果规则含
if、set或需要操作PATH_INFO,别放这里——宝塔会把它插在错误位置,大概率被忽略; - 修改后务必点「保存」再「重载配置」,仅「重启 Nginx」不生效;
- 验证是否加载:执行
nginx -t,看输出里是否有你写的规则片段;若无,说明宝塔没写进去,得手动改 conf 文件。
为什么开了伪静态还是跳首页或报 No input file specified?
这不是规则没生效,而是 fastcgi_param 传参出错。典型表现是 URL 看起来“重写成功”,但 PHP 脚本根本没收到 s= 参数,或者 SCRIPT_FILENAME 指向了错误路径。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 检查
fastcgi_param SCRIPT_FILENAME是否为$document_root$fastcgi_script_name(不能写死路径); - 确认站点根目录(
root)指向的是 ThinkPHP 的public/目录,不是项目根目录; - 在
index.php开头加var_dump($_SERVER['REQUEST_URI'], $_GET); die;,看实际收到的参数是不是空; - 如果看到
No input file specified,八成是SCRIPT_FILENAME拼出来路径不存在,用ls -l对照着查。
伪静态真正卡点从来不在 rewrite 语法,而在 Nginx 如何把重写后的 URI 正确转给 PHP-FPM —— 这部分漏掉任意一环,页面就永远停在 404 或空白。



















