nginx配置未对齐导致404:root须指向public目录、path_info需显式传递、try_files规则应置于php块前、script_filename必须用$realpath_root。

本地能跑通、服务器上路由 404,基本不是代码问题,而是 Nginx 配置在两个环境间没对齐。核心差异往往藏在路径指向、参数透传和规则生效条件里。
确认 public 目录是否为真实 Web 根目录
ThinkPHP 5 强制要求 Web 服务器的 root 必须指向 public/ 子目录,而不是项目根目录。本地用 phpStudy 或 XAMPP 可能默认进了 public,但服务器(尤其是宝塔或手动编译)常误设为项目根目录。
- 检查 Nginx 配置中的
root指令:必须是类似root /www/wwwroot/example.com/public;,末尾带斜杠且路径精确到public - 如果 root 错写成
/www/wwwroot/example.com,Nginx 会尝试加载/index.php(找不到),而非/public/index.php,直接 404 - 验证方式:临时在 public/ 下放一个
test.txt,访问https://yoursite.com/test.txt能打开才算 root 正确
检查 PATH_INFO 是否被正确传递
ThinkPHP 5 默认依赖 $_SERVER['PATH_INFO'] 解析路由(如 /user/list → s=user/list)。Nginx 不像 Apache 自动填充,必须显式配置。
- 在
location ~ \.php$块内,必须包含这一行:fastcgi_param PATH_INFO $fastcgi_path_info; - 同时确保
fastcgi_split_path_info未被启用或已注释——TP5 不需要它,留着反而清空 PATH_INFO - 调试方法:在
public/index.php开头加var_dump($_SERVER['PATH_INFO']);die();,访问任意路由看输出是否为空;为空就说明这步没配对
伪静态规则本身是否真正生效
规则写了≠生效。常见“假生效”场景:
-
location /块位置错误:必须放在location ~ \.php$之前,否则 PHP 处理块先匹配,try_files或if根本不执行 - 推荐用
try_files替代if:location / { try_files $uri $uri/ /index.php?$query_string; }
它不依赖 PATH_INFO,兼容性更好,也避免 Windows 下大小写/路径分隔符导致的异常 - 若用
if (!-e $request_filename)方式,需确认if块在location /内,且没有被其他location覆盖(比如有location ^~ /static/之类)
检查 fastcgi_param SCRIPT_FILENAME 是否拼对
这是最隐蔽却高频出错的一环:Nginx 找不到 index.php 文件,就会返回 404(不是框架报错,是 Nginx 自己的 404)。
- 在
location ~ \.php$块中,必须有:fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; - 不能写成
$document_root—— 它可能因 alias 或子目录配置而失效;$realpath_root是经过解析的真实物理路径,更可靠 - 检查错误日志:
tail -f /var/log/nginx/error.log,出现Primary script unknown就是这个参数错了
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











