ThinkPHP6在宝塔Nginx下必须添加rewrite规则才能隐藏index.php,否则因PATH_INFO模式不被默认支持而导致404;需在server块中location ~ .php$前插入if重写规则,并确保PATH_INFO正确传递。

ThinkPHP6 在宝塔 Nginx 下必须加 rewrite 规则,否则 index.php 无法隐藏
宝塔默认的 PHP 站点配置不兼容 ThinkPHP6 的 URL 路由机制,不加重写规则会导致所有请求都 404 或强制跳转到 index.php。核心原因是 TP6 默认使用 PATH_INFO 模式(非兼容模式),而 Nginx 不像 Apache 自带 .htaccess 支持,必须显式声明如何解析路径。
直接在宝塔站点配置中添加标准 TP6 location 块
进入宝塔 → 网站 → 对应站点 → 配置文件,在 server 块内、location ~ \.php$ 之前插入以下规则:
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
}
注意三点:
-
if块虽被 Nginx 官方标记为“不推荐”,但在宝塔 + TP6 场景下仍是兼容性最好、最不易出错的方式;用try_files替代容易因 root 路径或 fastcgi_params 配置偏差导致 500 - 必须放在
location ~ \.php$之前,否则 PHP 文件匹配优先级更高,rewrite 不生效 -
last是关键,它让重写后重新匹配 location,确保/index.php?s=xxx能进到 PHP 处理流程;用break或redirect都会失败
确认 PHP 配置未开启 pathinfo 禁用或覆盖
即使 rewrite 正确,TP6 仍可能报 URL pathinfo not supported 错误。检查两点:
立即学习“PHP免费学习笔记(深入)”;
- 宝塔 → 网站 → 对应站点 → PHP 版本 → 设置 → 禁用函数里,确保
putenv和ini_set没被禁用(TP6 启动时需动态设PATH_INFO) - 在站点根目录的
public/index.php开头加一行:$_SERVER['PATH_INFO'] = $_SERVER['REQUEST_URI'];(仅调试用,上线前删掉;真要长期用请改config/app.php中的url_common_param) - PHP-FPM 配置中,
fastcgi_param PATH_INFO $fastcgi_path_info;这行不能被注释或删掉——宝塔默认保留,但升级 PHP 版本后偶尔会重置
验证是否生效及常见 404 场景
改完配置后务必点击宝塔「保存」→「重载 Nginx」。验证方式:
- 访问
https://yourdomain.com/index/test,若正常显示控制器输出,说明 rewrite 生效 - 访问
https://yourdomain.com/abc(一个不存在的路由),返回 TP6 的 404 页面而非 Nginx 默认 404,说明请求已进框架 - 如果仍 404,检查 Nginx 错误日志:
/www/wwwlogs/yourdomain_error.log,高频错误是rewrite or internal redirection cycle,通常因 location 块重复或 if 条件写错(比如漏了!) - 别在宝塔「伪静态」选项卡里填规则——那里只对 Apache 生效,Nginx 站点该选项卡内容会被忽略
真正麻烦的不是加哪几行,而是 Nginx 匹配顺序、PATH_INFO 传递链、以及宝塔每次重载时悄悄覆盖你手动加的注释——建议把关键 rewrite 块用 # TP6 REWRITE START 和 # TP6 REWRITE END 包裹,方便下次快速定位。



















