开启伪静态后文章页面出现 404 错误,通常是因为 Nginx 未将不存在的文件请求转发给框架入口文件(如 index.php)。需要在 Nginx 配置文件的 location / 块中添加 try_files 或 rewrite 规则,并确保 root 指向项目的 public 目录。
先说结论:这不是代码错误,而是 Nginx 配置缺失了请求转发逻辑,导致框架路由未启动。
- 先确认 location / 块中是否有 try_files 或 rewrite 规则指向 index.php
- 先处理 root 目录路径,必须指向项目的 public 子目录而非项目根目录
- 再验证 fastcgi_param PATH_INFO 是否传递,防止路径信息丢失
命令速用版
以下配置适用于大多数基于 PHP 的 CMS 或框架(如 ThinkPHP、WordPress),请根据实际入口文件调整:
server {
listen 80;
server_name example.com;
root /var/www/html/public; # 必须指向 public 目录
index index.php index.html;
location / {
# 核心转发规则:文件不存在则交给 index.php
try_files $uri $uri/ /index.php?$query_string;
# 或使用 rewrite 方式:
# if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; }
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info; # 传递路径信息
include fastcgi_params;
}
}为什么会这样
Nginx 默认行为是先在文件系统中查找请求路径对应的真实文件或目录,找不到就直接返回 404,不会调用 PHP 解释器。伪静态的本质是让 Nginx 把看似文件的路径(如/article/123)交给框架的入口文件(如 index.php)去解析路由。如果缺少转发规则,框架根本没启动,自然无法匹配文章页面。
分步处理
第一步:检查 location / 配置
打开 Nginx 站点配置文件,确认 location / 块内包含 try_files 或 rewrite 规则。如果只有 root 和 index 指令,请求非真实文件时会直接 404。
第二步:核对 root 路径
确认 root 指令指向的是项目的 public 目录(例如 /var/www/myapp/public),而不是项目根目录。错误的路径会导致 SCRIPT_FILENAME 拼接错误,PHP 无法找到入口文件。
第三步:配置 PATH_INFO 参数
在 location ~ \.php$ 块中,确保包含 fastcgi_param PATH_INFO $fastcgi_path_info; 和 fastcgi_split_path_info ^(.+\.php)(/.+)$;。缺少这两行会导致框架获取不到 URL 中的路径信息,路由匹配失败。
第四步:重载 Nginx 配置
修改完成后执行 nginx -t 检查语法,确认无误后执行 nginx -s reload 生效。不要直接重启服务,避免中断现有连接。
怎么验证是否生效
使用 curl 测试响应头
执行 curl -I http://yourdomain/article/123,检查响应头是否包含框架特征(如 X-Powered-By: ThinkPHP)或状态码是否为 200。如果仍是 404 且无框架头,说明请求未进入 PHP。
直接访问入口文件测试
尝试访问 http://yourdomain/index.php?s=/article/123。如果此链接能正常显示内容,但去掉 index.php 后 404,证明框架正常,问题确认为 Nginx 伪静态规则缺失。
查看错误日志
检查 Nginx 错误日志(通常位于 /var/log/nginx/error.log 或 logs/error.log)。如果出现"No input file specified"或"Primary script unknown",说明 SCRIPT_FILENAME 路径配置错误。
常见坑
root 路径指向错误
很多框架要求运行目录为 public,如果 root 指向项目根目录,可能导致入口文件路径错误或安全风险。
location 匹配顺序问题
正则 location ~ \.php$ 的优先级高于普通 location /。如果配置顺序不当或 try_files 写法错误,PHP 请求可能被静态规则拦截。
静态资源被误转发
如果 rewrite 规则未排除真实存在的文件(如 css、js、图片),会导致静态资源也交给 PHP 处理,引发 500 错误或加载失败。
常见问题
首页能打开但内页文章 404 怎么办?
这是因为首页对应真实文件(index.html 或 index.php),而内页是虚拟路径。请检查 location / 中是否有 try_files $uri $uri/ /index.php?$query_string; 规则。
配置后静态文件(css/js)也 404 怎么办?
说明 rewrite 规则未判断文件是否存在。请确保使用 try_files 指令,或在 rewrite 前加 if (!-e $request_filename) 判断,避免将真实文件转发给 index.php。
宝塔面板设置伪静态后仍然 404 怎么办?
宝塔生成的规则可能针对旧版本框架。请手动检查配置文件,确认 root 是否指向 public 目录,并确认运行目录设置是否正确。
参考来源
- Nginx 怎么配置 404 错误页面 Nginx 自定义错误跳转设置详解
- ThinkPHP 部署后报 404 Not Found 的 Nginx 伪静态规则配置详解
- ThinkPHP 伪静态配置后首页正常内页 404 解决操作【方法】
- 解决 ThinkPHP 访问路由 404:Nginx 伪静态配置指南
- 如何解决网站伪静态设置后首页正常但其他页面 404 的问题 - 黄文 Rex - 博客园