ThinkPHP 6 伪静态必须禁用 fastcgi_split_path_info 并设 fastcgi_param PATH_INFO $request_uri,伪静态规则为 if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; }。

ThinkPHP 和 Laravel 的伪静态规则不能混用,直接套宝塔默认模板或网上搜来的规则,大概率 404 或路由全 fallback 到首页。
ThinkPHP 6/8 的 PATH_INFO 模式必须关掉 fastcgi_split_path_info
宝塔新建站点时若选了「Laravel」模板,会自动加 fastcgi_split_path_info,但 ThinkPHP 6+ 默认走 index.php?s=xxx 或 index.php/xxx 路由,它不依赖 Nginx 拆分 PATH_INFO —— 反而会被这个配置清空 $_SERVER['PATH_INFO'],导致路由识别失败。
- 进宝塔「网站 → 设置 → 配置文件」,找到
location ~ \.php($|/)块 - 删掉这两行:
fastcgi_split_path_info ^(.+\.php)(/.+)$;和fastcgi_param PATH_INFO $fastcgi_path_info; - 补上这行(确保 PATH_INFO 传原始 URI):
fastcgi_param PATH_INFO $request_uri; - 伪静态框里填标准规则:
if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; }
Laravel 标准模式要避免 s= 参数,且必须用 try_files
Laravel 官方路由解析只认 QUERY_STRING(如 ?page=2),完全不处理 s=xxx 这类参数。填错就会所有请求都进首页或 404;另外,if 在 server 级被 Nginx 官方标记为不安全,优先用 try_files。
- 伪静态框里不要写
if,直接粘贴:location / { try_files $uri $uri/ /index.php?$query_string; } - 确认
location ~ \.php($|/)块里有fastcgi_split_path_info和fastcgi_param PATH_INFO $fastcgi_path_info;(Laravel 需要它) - 如果部署在子目录(如
https://a.com/app/),要把location /改成location /app/,且try_files第二项写成$uri/ /app/index.php?$query_string;
保存后不生效?先看 error.log 有没有 internal redirection cycle
90% 的“规则写了但没用”问题,不是规则本身错,而是重写进了死循环,或者被防跨站、CDN、多层反代拦截了。
立即学习“PHP免费学习笔记(深入)”;
- 执行
tail -f /www/wwwlogs/nginx_error.log,访问一个伪静态 URL(比如/about),看日志是否刷出rewrite or internal redirection cycle - 检查宝塔 PHP 设置 → 禁用函数里有没有
putenv—— 它会影响 PATH_INFO 解析 - 如果用了 CDN(如 Cloudflare),伪静态必须在 CDN 控制台也配一遍,宝塔只管源站
- 子目录部署时,
root路径和location前缀必须严格对应,大小写、末尾斜杠都不能差
最麻烦的点其实是 PATH_INFO 的传递链:Nginx → fastcgi_param → PHP → 框架,任意一环断掉,$_SERVER 里就拿不到原始路径,框架路由自然失效。别只盯着伪静态框,得连着配置文件一起查。



















