首页正常而内页全404,说明伪静态未生效,请求未进入ThinkPHP路由系统;验证方法是访问/index.php/内页路径,若能打开则问题在Nginx配置,否则需查PHP环境或权限。

首页能打开、内页全404,基本可以断定是伪静态没真正生效——请求压根没进到 ThinkPHP 的路由系统里,Nginx 直接按文件路径去找,找不到就甩个 404。
确认是不是伪静态根本没起作用
最直接的验证方法:在浏览器里访问 http://你的域名/index.php/任意内页路径(比如 /index/user 或 /hello)。
如果能正常打开,说明框架本身没问题,问题出在 Nginx 配置;
如果还是 404 或空白,就要先查 PHP 环境、入口文件权限或 public 目录是否可读。
Nginx 配置必须满足的三个硬性条件
ThinkPHP 5.0 对 Nginx 伪静态要求明确,以下三点缺一不可:
-
root 必须指向 public 目录:例如项目实际路径是
/www/wwwroot/myapp,那么 Nginx 的root指令必须写成/www/wwwroot/myapp/public。写成项目根目录会导致自动加载失败、白屏且无报错。 -
location / 块里要有兜底转发规则:推荐使用
try_files $uri $uri/ /index.php?s=$1;(TP5 兼容写法)。注意不是$query_string,那是 TP6/8 的用法;s=$1是 TP5 解析 PATH_INFO 的关键。 -
PHP 处理块要传对 SCRIPT_FILENAME:确保
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;这一行存在,且$document_root和前面的root一致。
检查宝塔或手动配置是否真正生效
很多用户点了“伪静态 → ThinkPHP”模板就以为完事了,其实容易漏掉关键步骤:
立即学习“PHP免费学习笔记(深入)”;
- 打开生成的站点配置文件(如
/www/server/panel/vhost/nginx/xxx.conf),确认location /块里确实写了上面那条try_files或if (!-e ...)规则,而不是空着或被注释掉。 - 执行
nginx -t测试语法,再运行systemctl reload nginx(或service nginx reload)重载配置。 - 清空
runtime/下所有缓存文件,特别是route.php和cache/目录,避免旧路由结构残留。
额外两个易忽略点
即使配置看起来都对,也可能卡在这两个细节上:
-
URL 大小写敏感:Linux 服务器严格区分大小写。比如路由定义的是
Route::get('User/list', 'index/user');,但链接写成/user/list,就会 404。开发时建议统一用小写路径,控制器类名首字母大写即可。 -
强制路由开启后静态资源也被拦截:如果开启了
'url_route_must' => true,连/static/css/app.css这类资源都会 404。解决办法是在路由文件开头加一条放行规则:Route::rule('static/[:path]', 'static/$1', 'GET', ['ext' => 'css|js|png|jpg|gif']);



















