thinkphp5伪静态404核心原因是nginx未将/user/list等请求转发至index.php,而是直接查找文件系统路径导致404;需确保root指向项目根目录、location/块含try_files转发、php块中script_filename和path_info配置正确。

ThinkPHP5 伪静态 404 的核心原因很明确:Nginx 没把 /user/list 这类请求转发给 index.php,而是直接去文件系统找路径,找不到就返回 404。框架压根没启动,路由、控制器都还没机会执行。
为什么首页能打开,内页却 404?
这是最典型的误判信号:
-
/能打开 → PHP 和入口文件没问题 -
/index.php/user/list能通 → 路由定义和控制器逻辑大概率没问题 -
/user/list404 → 请求卡在 Nginx 层,根本没进 PHP
别急着改 route.php 或查控制器命名——先确认 Web 服务器有没有把 URL 正确交给框架。
Nginx 配置必须满足的三个硬性条件
漏掉任意一个,TP5 伪静态必挂:
-
root必须指向项目根目录(不是public/),因为 TP5 入口是index.php在项目根下 -
location /块里必须有转发逻辑:try_files $uri $uri/ /index.php?$query_string; -
location ~ \.php$块内必须包含:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;(不能用$request_filename)
特别注意:宝塔面板「伪静态 → ThinkPHP」模板默认生成的是这条规则:if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s= last; }——它对 TP5 是可用的,但必须确保 root 指向正确,且 location ~ \.php$ 中没有冲突的 try_files $uri =404;(常见于宝塔默认的 74.conf,得注释掉)。
PATH_INFO 为空导致路由解析失败
即使请求进了 index.php,如果 $_SERVER['PATH_INFO'] 是空的,TP5 就无法提取 /user/list 这段路径,所有路由都匹配不上。
检查点:
- Nginx 配置中是否有
fastcgi_split_path_info ^(.+\.php)(/.*)$;(配合$fastcgi_path_info使用) -
location ~ \.php$块内是否设置了fastcgi_param PATH_INFO $fastcgi_path_info; - 在
index.php开头加var_dump($_SERVER['PATH_INFO']);,访问/user/list时应输出/user/list,而不是空字符串或/index.php
Apache 下 .htaccess 不生效怎么办?
TP5 的 Apache 伪静态依赖 .htaccess,但它不会自动生效:
- 确认
mod_rewrite已启用:a2enmod rewrite(Ubuntu/Debian)后重启 Apache - 虚拟主机配置中必须允许覆盖:
AllowOverride All(不能是None) -
.htaccess内容要完整,典型兜底规则是:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?s=$1 [L]
[L] 很关键,缺了可能导致规则跳过或循环;s=$1 是 TP5 默认接收方式,不能写成 /$1 或 ?r=$1。
最容易被忽略的是:TP5 的伪静态规则和入口位置强绑定,换环境不调配置,99% 会 404。尤其是从本地 Apache 迁移到宝塔 Nginx,不能只复制规则,还得核对 root、SCRIPT_FILENAME、PATH_INFO 三处是否真正对齐。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











