ThinkPHP 8.0 伪静态需服务器(Nginx try_files + root指向public + PHP块含SCRIPT_FILENAME/PATH_INFO)、框架(url_route_on=true、pathinfo_depr='/')和目录结构三者严格对齐,缺一导致404或白屏。

ThinkPHP 8.0 配置伪静态,核心不是加一条 rewrite 就完事,而是服务器转发、框架路由、目录结构三者必须对齐。配错任意一环,轻则 URL 带 index.php,重则白屏或 404。
Nginx 配置位置和写法
伪静态规则必须写在 server 块内的 location / { } 中,且必须位于 location ~ \.php$ 块之前。Nginx 按顺序匹配,location / 是兜底规则,负责判断请求是否为真实文件或目录;只有它先放行非静态资源,后续才能把 /user/list 这类地址交由 index.php 处理。
推荐使用 try_files 方式(更安全、无 if 副作用):
- 确保 root 指向 public 目录,例如:
root /www/wwwroot/myapp/public; - 在 location / 内写入:
try_files $uri $uri/ /index.php?$query_string; - 不要写在 location ~ \.php$ 里,也不要用 if (!-e $request_filename),Windows 下易导致 PATH_INFO 为空,TP8 直接静默失败
PHP 处理块的关键参数
即使 try_files 转发成功,若 PHP 找不到入口文件,照样报 Primary script unknown。location ~ \.php$ 块中必须包含:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
-
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;(注意是 $document_root,不是 $request_filename) fastcgi_param PATH_INFO $fastcgi_path_info;fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
漏掉 PATH_INFO 或用错变量,TP8 的路由解析会中断,所有带路径的请求都 fallback 到默认行为。
框架内必须开启的配置
仅改 Nginx 不够,还要让框架“认得”这个伪静态环境:
- 确认
config/app.php中'url_route_on' => true已启用 -
'pathinfo_depr' => '/'(保持默认斜杠分隔,与 Nginx 规则一致) - 如需 .html 后缀,可设
'url_html_suffix' => '.html',但不影响伪静态主逻辑 - 多应用模式下,还需检查
config/app.php的domain_bind是否与访问域名完全一致(含 www、端口)
验证是否生效
配完别急着上线,按顺序验证:
- 执行
nginx -t确保语法正确,再nginx -s reload - 直接访问
http://yoursite.com/index.php/index/hello,能打开说明 PHP 和框架正常 - 再访问
http://yoursite.com/index/hello,能打开且地址栏不跳转回 index.php,才算伪静态真正生效 - 查 Nginx 错误日志(如
/www/wwwlogs/yoursite.error.log),搜索 Primary script unknown 或 FastCGI sent in stderr 可快速定位路径或执行问题
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










