thinkphp伪静态404的根本原因是nginx未将请求转发至index.php,而是直接在文件系统中查找路径导致404;需检查allowoverride(apache)、try_files配置(nginx)、path_info传递及二级目录路径透传。

ThinkPHP 伪静态 404 的根本原因
不是规则写错了,而是 Nginx 根本没把请求交给 index.php。它在文件系统里找 /user/login 这个路径对应的物理文件,找不到就直接返回 404 —— 路由层压根没启动。
常见错误现象包括:首页能打开,但所有带斜杠的路由(如 /admin/index、/api/v1/users)全 404;$_SERVER['PATH_INFO'] 为空;url() 生成的链接正常,但点进去就炸。
- Apache 用户要确认
.htaccess文件存在且被读取(检查httpd.conf中是否启用了AllowOverride All) - Nginx 用户必须在
location /块里显式重写,不能依赖框架自动识别 - 宝塔用户常忽略「运行目录」设置:ThinkPHP 6+ 推荐设为
/public,此时所有规则都基于该子目录生效
宝塔面板中直接套用 ThinkPHP 伪静态规则
别手写,先用宝塔内置模板保底。它已适配 PHP 8.4 和主流 ThinkPHP 版本,比网上抄的旧规则更稳。
- 进宝塔「网站」→「设置」→「伪静态」→ 下拉选「ThinkPHP」(不是「ThinkPHP5」或空值)
- 点击「保存」,宝塔会自动写入标准
try_files规则,并触发 Nginx 重载 - 如果没生效,立刻 SSH 执行
nginx -t && service nginx reload,避免配置缓存 - 若选了模板仍 404,检查「网站目录」里的「运行目录」是否设成了
/public—— 设错会导致规则匹配路径偏移
手动修复 Nginx location 块中的 try_files 写法
宝塔模板失效时,得进「配置文件」页签,找到 location / 段落,替换掉老旧的 if + rewrite 写法。PHP 8.4 对 if 在 location 中的使用更敏感,容易触发重写循环或被跳过。
- 删掉整段类似
if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; }的代码 - 替换成标准写法:
location / { try_files $uri $uri/ /index.php?$query_string; } - 如果部署在二级目录(如
/myapp/),必须改用location /myapp/,且重写目标补全路径:/myapp/index.php?$query_string - 务必确认
fastcgi_param PATH_INFO $fastcgi_path_info;这一行存在,否则index.php/xxx中的/xxx段不会传给 PHP
PATH_INFO 在 PHP 8.4 下被截断怎么办
PHP 8.4 默认不解析 PATH_INFO,ThinkPHP 依赖它做路由分发,所以即使 Nginx 规则正确,$_SERVER['PATH_INFO'] 仍是空的。
- 进宝塔「软件商店」→「Nginx」→「设置」→「配置修改」
- 编辑
/www/server/nginx/conf/enable-php-84.conf(路径名含版本号,别开错) - 搜索
fastcgi_param PATH_INFO,确保它没被注释,且值是$fastcgi_path_info,不是空字符串或"" - 同时检查
fastcgi_split_path_info是否启用:应有类似fastcgi_split_path_info ^(.+?\.php)(/.*)$;的行,且未被注释 - 改完保存,再执行
nginx -t && service nginx reload,然后重启 PHP-FPM(service php-fpm-84 restart)
二级目录部署时最容易漏掉 fastcgi_param PATH_INFO 这一行,它不写,路由就永远收不到路径后缀 —— 其他都对也没用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











