ThinkPHP 404 主因是 Web 服务器未正确配置 URL 重写以统一入口 index.php;Nginx 需加 try_files 指令,Apache 需启用 AllowOverride All 并确保 RewriteRule 含 [L] 标志,同时校准 PATH_INFO 或改用 QUERY_STRING 模式。

ThinkPHP 404 是因为 URL 重写没生效
绝大多数 ThinkPHP 项目在 Nginx 或 Apache 上部署后报 404,根本原因不是代码问题,而是 Web 服务器没把 index.php 作为入口统一接管请求。ThinkPHP 的路由依赖 PATH_INFO 或 QUERY_STRING(如 ?s=/index/index),而默认配置下,Nginx/Apache 直接按文件路径匹配,/index/index 这种路径根本不存在物理文件,自然 404。
Nginx 配置必须加 try_files 指令
ThinkPHP 官方给的 Nginx 示例容易漏掉关键细节:没有 try_files,或写错顺序。错误配置常表现为首页能访问、二级路由全 404。
- 务必在
location /块中加入:try_files $uri $uri/ /index.php?s=$uri&$args; - 如果用的是 ThinkPHP 6+(支持子目录部署),且入口文件在
/public下,root要指向/path/to/your/project/public,且try_files改为:try_files $uri $uri/ /index.php?$query_string; - 禁用
fastcgi_split_path_info的暴力正则(如^(.+\.php)(/.+)$),它在 PHP 8.0+ 和某些 Nginx 版本下会截断 PATH_INFO,导致Route::rule()失效
Apache .htaccess 里 RewriteRule 不能少 [L] 标志
Apache 默认允许 .htaccess,但很多生产环境关闭了 AllowOverride All,或漏写 [L] 导致规则链继续执行,最终 fallback 到 404。
- 确认虚拟主机配置含:
AllowOverride All(在<directory></directory>块内) - .htaccess 中必须有:
RewriteRule ^(.*)$ index.php?s=/$1 [L](TP5/6 兼容写法) - 如果项目放在子目录(如
http://example.com/myapp/),需补RewriteBase /myapp/,否则$1会多带前缀,路由解析错乱 - 避免使用
RewriteCond %{REQUEST_FILENAME} !-f+!-d组合判断——ThinkPHP 的静态资源(CSS/JS)可能由控制器输出,这类判断会误拦
PATH_INFO 模式失效时,先检查 php.ini 和服务器环境
即使重写规则正确,$_SERVER['PATH_INFO'] 仍为空,常见于 CGI/FastCGI 模式下 PATH_INFO 被丢弃,或 PHP 配置限制。
立即学习“PHP免费学习笔记(深入)”;
- 查看
phpinfo()中Server API:如果是FPM/FastCGI,需确认 Nginx 的fastcgi_param是否传了 PATH_INFO —— 正确写法是:fastcgi_param PATH_INFO $fastcgi_path_info;(注意不是$path_info) - 检查
php.ini中cgi.fix_pathinfo必须为1(默认值),设为0会直接禁用 PATH_INFO - ThinkPHP 6+ 默认用
QUERY_STRING模式(?s=/xxx),若你强制开启'url_common' => true却未配好 PATH_INFO,就必然 404 —— 这时候不如关掉它,用兼容性更好的参数模式
重写规则本身不难,难的是每层环境(Web 服务器 → PHP SAPI → ThinkPHP 配置)都得对齐。一个字母写错、一个分号漏掉、一个标志位缺失,都会让路由链在中途断裂。别急着改框架配置,先用 curl -v http://yoursite/index/index 看响应头和真实返回内容,比盲调快得多。



















