内页404但首页正常或加/index.php/可访问,说明伪静态未生效,请求未进入ThinkPHP;需确认Nginx的root指向public目录、location /含try_files $uri $uri/ /index.php?$query_string、fastcgi_param SCRIPT_FILENAME配置正确,并检查错误日志定位Primary script unknown等问题。

内页 404 但首页正常,或加 /index.php/ 就能打开(比如 /index.php/user/login 成功,/user/login 报 404),说明伪静态根本没生效——请求压根没进 PHP,更没到 ThinkPHP 路由层。这不是代码写错了,是 Web 服务器没把路转对。
确认 Web 服务器类型和入口路径
先搞清你用的是 Nginx 还是 Apache,再看项目结构:
- Nginx 用户:ThinkPHP 6/8 必须让
root指向public/目录(不是项目根目录)。例如项目在/www/wwwroot/myapp,Nginx 配置里必须写root /www/wwwroot/myapp/public; - Apache 用户:确保
.htaccess文件真实存在且位于public/目录下;同时检查httpd.conf中是否启用mod_rewrite,且对应虚拟主机的AllowOverride设为All - 宝塔用户:网站设置 → 网站目录 → “运行目录”必须选
/public,不能留空或填/
检查核心转发规则是否写对
规则没生效,多半卡在这几处:
- Nginx 的
location / { }块里必须有兜底转发,推荐写法:try_files $uri $uri/ /index.php?$query_string;(TP6/8)
或try_files $uri $uri/ /index.php?s=$1;(TP5) - 别用老旧的
if (!-e $request_filename),尤其 TP8 下易导致PATH_INFO为空 - 如果项目部署在子目录(如
/myapp/),需单独配location /myapp/ { },并把转发目标改为/myapp/index.php?$query_string
验证 PHP 处理参数是否传全
即使 URL 转过去了,PHP 没收到关键参数也会报 404 或空白页:
- 在
location ~ \.php$ { }块中,必须包含:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - TP6/8 强烈建议加上:
fastcgi_param PATH_INFO $fastcgi_path_info;
否则路由解析可能失败,$_SERVER['PATH_INFO']为空 - 确保该
location ~ \.php$块未被前面的if或rewrite提前截断
排除缓存与配置加载干扰
改完不生效?常因旧配置或缓存残留:
- 执行
nginx -t测试语法,再nginx -s reload(或宝塔点「重载配置」)——只保存不重载等于白改 - 清空
runtime/下所有文件,特别是route_cache.php和cache/目录 - 临时在
public/index.php开头加一句:var_dump($_SERVER['PATH_INFO'], $_GET); die();
看实际接收到的路径和参数是否符合预期 - 查 Nginx 错误日志(如宝塔路径:
/www/wwwlogs/your-site.error.log),搜Primary script unknown或no such file,直接定位路径错误点
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











