ThinkPHP 6.0 在反向代理下需先禁用伪静态再配置反代,启用时须将 rewrite 放在 proxy_pass 前、精准匹配非代理路径,并在 config/app.php 中强制 https=true、url_common_param=true、url_route_must=false 以修复协议识别与路由异常。

ThinkPHP 6.0 在反向代理(如 Nginx 或 Apache 前置 HTTPS 终止)环境下配置伪静态,关键不是“能不能开”,而是“怎么开才不冲突”。常见错误是:一开伪静态,反向代理就失效;一配反代,URL 就 404 或跳 install.php。核心矛盾在于入口路径解析与协议识别被双重干扰。
先停用伪静态,再配反向代理
宝塔或手动配置时,务必按顺序操作:
- 进入网站设置 → 伪静态 → 选择“无”或清空规则,保存
- 再去“反向代理”页面添加代理规则(如 /api → http://127.0.0.1:8080/)
- 确认代理生效后(可 curl 测试返回内容),再考虑是否启用伪静态
- 若必须同时启用,Nginx 配置中需将伪静态 rewrite 规则放在 proxy_pass 之前,且避免覆盖代理路径
TP6 伪静态规则本身要适配反代环境
默认的 ThinkPHP Nginx 伪静态规则(如 rewrite ^(.*)$ /index.php?s=$1 last;)在反向代理下极易出错,因为:
- 代理已把请求转为 HTTP,但 TP6 仍尝试从 $_SERVER['HTTPS'] 判断协议,导致 URL 生成、Cookie secure 等异常
- rewrite 会重写所有路径,可能把代理路径(如 /ws)也强行跳转到 index.php,破坏 WebSocket 或 API 接口
建议改用更精准的写法(Nginx 示例):
立即学习“PHP免费学习笔记(深入)”;
location / {
try_files $uri $uri/ /index.php?s=$uri&$args;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
注意:不要对 /ws、/api 等代理路径加 rewrite;确保 location / {} 块在 proxy_pass 规则之后(若共存)。
修复 TP6 的协议与入口识别
仅靠服务器配置不够,TP6 框架层必须主动适配:
- 在 config/app.php 中强制声明 HTTPS:
'https' => true,(否则 secure cookie、URL::build() 生成的链接仍为 http) - 开启通用参数模式:
'url_common_param' => true,(兼容旧式 /m/c/a 形式,尤其在反代后 pathinfo 易错乱时有用) - 关闭路由强制匹配:
'url_route_must' => false,(避免因 pathinfo 解析失败直接报错) - 如有必要,在 public/index.php 开头手动修正 $_SERVER['PATH_INFO'],例如剥离代理带来的多余前缀
验证与调试要点
配置完成后重点检查三项:
- 浏览器访问首页是否正常,且地址栏 URL 不跳 install.php(根目录指向 public 后常见此问题)
- 查看 DevTools → Application → Cookies,确认关键 Cookie 带有 Secure 和 HttpOnly 标志
- 用 curl -I http://your-domain.com/index/test 测试响应头,确认状态码为 200 而非 301/302 循环跳转
- 若使用 WebSocket,确保 /ws 路径未被 rewrite 干扰,并在 Nginx 中正确设置了 Upgrade 和 Connection 头



















