thinkphp伪静态404主因是rewrite未触发、last误写为break或public路径错位;需确保location /块置于location ~ .php$前、rewrite目标为/public/index.php、启用scandir等函数并重载nginx。

宝塔面板里 ThinkPHP 伪静态配不起来,95% 的问题不是规则写错了,而是规则根本没进 PHP 处理流程——rewrite 没触发、last 写成 break、或 public/ 路径错位导致 /index.php 404。
为什么 rewrite ^(.*)$ /index.php?s=$1 last 还是 404
这条规则本身没问题,但生效前提被破坏了:
-
location / { ... }块必须放在location ~ \.php$之前,否则 Nginx 先匹配到 PHP 文件规则,if根本不执行 -
last被误写成break:后者只重写 URL 不重新匹配 location,请求卡在静态文件查找阶段,直接 404 - 站点「运行目录」没设为
/public,而规则里写的是/index.php,实际要访问的是/public/index.php,结果rewrite后目标文件不存在 - 宝塔自动生成的配置里,
if (!-e $request_filename)被套在location ~ \.php$内部——这是无效的,if在location ~ \.php$中仅限于有限变量判断,不能做路径存在性检查
try_files $uri $uri/ /index.php?$query_string 为什么路由参数为空
TP6 默认依赖 $_GET['s'] 解析路由,但这个写法把原始路径塞进了 QUERY_STRING,没生成 s= 参数:
-
?$query_string只透传原有查询参数(如?a=1&b=2),不会自动把/user/list转成s=/user/list - 正确 fallback 应为
/index.php?s=$uri&$args,其中$uri是原始请求路径,$args是原有查询字符串(不含问号) - 若项目部署在子目录(如
/myapp/),$uri值是/myapp/user/list,需用正则截掉前缀,否则s值带多余路径 - 该写法还要求
location ~ \.php$块中明确包含fastcgi_param QUERY_STRING $query_string;,否则$args无法进入 PHP 环境
宝塔「伪静态」文本框粘贴后不生效的硬核排查点
别只信面板显示,得看真实配置是否加载、是否执行:
- 执行
nginx -t确认语法无误;再手动nginx -s reload,宝塔「保存」不等于重载 - 打开真实配置文件:
/www/server/panel/vhost/nginx/your-domain.conf,确认你粘贴的内容真出现在server { }块内,且不在注释中 - 检查是否有「反向代理」或「SSL 强制跳转」规则,它们可能在更外层
server块中提前拦截请求,导致伪静态逻辑未执行 - 用
curl -I http://localhost/abc测试,看响应头Location:是否出现意外跳转,或状态码是否为 404 而非 301/302 - 临时在
public/index.php开头加var_dump($_GET, $_SERVER['PATH_INFO'], $_SERVER['REQUEST_URI']);die;,确认参数是否真正到达 PHP 层
PATH_INFO 为空或错乱的底层原因
这不是 ThinkPHP 的锅,是 Nginx + PHP-FPM 的 CGI 参数传递链断了:
-
fastcgi_split_path_info必须禁用:TP6 不走 Apache 风格 PATH_INFO,该指令会强行拆分路径,把/user/list变成/index.php+/user/list,污染$_SERVER -
location ~ \.php$块中必须显式设置fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;,不能只靠include fastcgi_params;—— 后者不保证$realpath_root正确解析 - 若用了
alias指向public/,$document_root可能为空,应改用root /www/wwwroot/your-site/public;(结尾不加斜杠) - PHP 配置中
enable_dl关闭、scandir被禁用,会导致 TP6 启动时无法扫描路由文件,表现为路由全挂但无报错
最易被忽略的是:所有这些配置项都依赖 location / 和 location ~ \.php$ 的嵌套关系与执行顺序。错一个位置,整个链路就断掉,而错误现象全是“404”,看不出哪一环出了问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











