ThinkPHP部署Nginx后404主因是请求未进入框架,需确保root指向public、location含try_files $uri $uri/ /index.php?$query_string、SCRIPT_FILENAME用$document_root,并禁用error_page 404。

ThinkPHP部署到Nginx后出现404,大概率不是代码或路由写错了,而是请求压根没进框架——Nginx在文件系统里找 /user/login 这样的路径,找不到就直接返回原生404,index.php 根本没执行。修复关键在于让所有非真实静态资源的请求,都正确转发到 public/index.php。
第一步:确认请求是否进入框架
这是最不能跳过的验证环节:
- 访问
http://your-domain.com/index.php/route/test(确保该路由未定义) - 如果看到 ThinkPHP 的「Route not found」调试页,说明框架已接管,问题在路由配置或控制器;
- 如果返回 Nginx/Apache 默认 404 页面,且响应头里没有
X-Powered-By: ThinkPHP,那就停在这里——问题出在 Web 服务器入口接管层。
Nginx 配置三处硬性要求
以下三点缺一不可,错一个就会 404:
-
root 必须指向 public 目录:例如
root /var/www/myapp/public;,不能是项目根目录; -
location / 块必须含 try_files:
try_files $uri $uri/ /index.php?$query_string;,不能写成/index.php?s=...(TP6+ 已弃用); -
SCRIPT_FILENAME 必须用 $document_root:
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;,禁用$request_filename(重写后路径易错)。
宝塔、phpEnv 等面板用户特别注意
这些环境默认不启用框架所需规则:
立即学习“PHP免费学习笔记(深入)”;
- 宝塔:进「网站 → 设置 → 伪静态」,选 ThinkPHP 模板;再进「配置文件」,在
location / {内首行手动加try_files $uri $uri/ /index.php?$query_string;; - phpEnv:修改对应 vhost 文件,在
location /块中替换为if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; }; - 改完配置后,务必彻底重启 Nginx(不是“重载”,是停止再启动),否则不生效。
别让 Nginx 劫持了你的 404 页面
ThinkPHP 自定义的 404 是 PHP 层抛出的 HTTP 404 响应。但如果 Nginx 配了 error_page 404,它会直接返回自己的页面,PHP 根本没机会运行:
- 检查 Nginx 配置中是否有类似
error_page 404 /404.html;的语句,删掉或注释; - 多级反向代理时,留意
Host和X-Forwarded-For是否被篡改,可能导致域名绑定失效,间接触发 404。



















