伪静态未生效,因Nginx未将请求转发至ThinkPHP:需确认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),说明请求压根没进 ThinkPHP——伪静态根本没生效。这不是路由写错了,是 Nginx 没把路交给框架。
确认 root 是否指向 public 目录
ThinkPHP 6/8 的 Web 入口必须是 public/ 目录,不是项目根目录。
- 错误写法:
root /www/wwwroot/myapp;(指向项目根,会导致类找不到、空白页且无报错) - 正确写法:
root /www/wwwroot/myapp/public; - Windows 下注意用正斜杠,且加英文引号:
root "D:/www/myapp/public"; - 宝塔用户:网站设置 → 网站目录 → “运行目录”必须选
/public,不是“不设置”或“/”
检查 location / 块是否含兜底规则
没有这行,Nginx 就不会把非静态路径转给 index.php:
- 推荐写法:
try_files $uri $uri/ /index.php?$query_string; - 必须放在
location / { ... }块里,且不能被其他 if 或 rewrite 覆盖 - 别用老旧的
if (!-e $request_filename),尤其在 TP8 下易导致 PATH_INFO 为空 - 如果项目部署在子目录(如
/myapp/),要单独配location /myapp/ { ... },并把 try_files 改为/myapp/index.php?$query_string
验证 PHP 处理块是否传了关键参数
缺这一行,PHP 根本收不到请求,Nginx 错误日志会报 Primary script unknown:
- 在
location ~ \.php$ { ... }块里,必须有:fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - TP6/8 还建议加上:
fastcgi_param PATH_INFO $fastcgi_path_info;,否则路由解析可能失败 - 确保该 location 块未被前面的 if 或 rewrite 提前截断
排除框架和缓存干扰
伪静态通了,但还是 404,再查这几项:
- 确认
config/app.php中:'url_route_on' => true,'pathinfo_depr' => '/','url_html_suffix' => ''(非空会强制加 .html) - 清空
runtime/目录下所有缓存文件(特别是 route_cache.php) - 用
var_dump($_SERVER['PATH_INFO'], $_GET);在入口文件临时加一句,看实际接收到的路径参数是不是你预期的 - 查看 Nginx 错误日志(宝塔路径:
/www/wwwlogs/your-site.error.log),搜索Primary script unknown或no such file,直接定位路径错误点
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











