ThinkPHP 8.0伪静态规则更严格:入口强制public目录、PATH_INFO必须显式配置、多应用改用注解绑定、Nginx禁用if改用try_files,任一偏差即白屏或404。

ThinkPHP 8.0 的伪静态规则在底层逻辑上和 6.0 表面相似,但实际生效条件更严格、容错性更低——不是“写对 rewrite 就行”,而是服务器、框架、目录结构三者必须严丝合缝对齐,任一偏差就会白屏或 404。
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
入口路径强制统一到 public 目录
TP8.0 入口文件 必须且只能从 public/index.php 启动,vendor/autoload.php、config、runtime 等全部路径都以 public 为基准。 而 TP6.0 虽也推荐 public 部署,但仍允许 root 指向项目根目录 + 手动调整 index.php 路径(如 require __DIR__.'/../vendor/autoload.php')。 → 若 Nginx 的 root 仍指向项目根目录(如 /var/www/myapp),TP8.0 直接加载失败、页面空白,不报错也不提示。
PATH_INFO 处理机制彻底重构
TP8.0 默认依赖 fastcgi_param PATH_INFO $fastcgi_path_info 解析路由路径(如 /user/list → PATH_INFO=/user/list),不再兼容旧式 PATH_INFO 模拟逻辑。
TP6.0 在部分 Nginx 配置下可容忍 PATH_INFO 缺失或为空,靠 fallback 机制兜底;TP8.0 一旦 $fastcgi_path_info 为空,路由解析直接中断,所有带斜杠的请求(/admin/login、/api/v1/user)全退回到默认行为。
→ 必须在 PHP 块中显式配置:
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
多应用模式绑定方式根本不同
TP6.0 支持通过 Route::domain('admin', 'admin') 或配置项 url_domain_deploy 实现子域名绑定;
TP8.0 完全弃用该方式,改为注解驱动:#[Domain('admin')] 必须加在控制器类或方法上,且需在 config/annotation.php 的 scan 列表中声明命名空间,修改后必须执行 php think clear --all。
→ 若沿用 TP6 的 domain 绑定写法,TP8.0 根本不识别应用上下文,/admin/xxx 请求会直接走默认应用,导致 404 或数据错乱。
Nginx 规则写法更保守、禁用 if 判断
TP6.0 文档中常见 if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?s=/$1 last; } 这类写法;
TP8.0 明确禁止该方案:Windows 下易清空 PATH_INFO,Nginx 版本升级后还可能触发重写循环。
→ 官方唯一推荐写法是 try_files:location / { try_files $uri $uri/ /index.php?$query_string; }
且必须放在 location ~ \.php$ 块之前,否则无法兜底转发。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










