ThinkPHP 8.0 伪静态要求 URL 不含 index.php 前缀,需通过 Nginx 的 try_files 指令将 /user/login 等请求隐式转发至 public/index.php 处理,并确保框架正确解析 PATH_INFO;错误写法如 rewrite 会导致地址栏暴露 index.php 或破坏请求数据。

不加 index.php 前缀。
ThinkPHP 8.0 的伪静态目标,就是让 URL 看起来干净,比如访问 /user/login,而不是 /index.php/user/login。加了 index.php 就不是伪静态,而是原始的 PATH_INFO 访问方式。
关键点在于:Nginx 负责把 /user/login 这类请求,内部转发给 public/index.php 处理;框架再从 $_SERVER 中提取路径信息(如 PATH_INFO 或 QUERY_STRING)来解析路由。
所以规则里不能出现 index.php 作为 URL 前缀,而应由 Nginx 在服务端隐式转发:
-
✅ 正确写法(放在
location / { }内):try_files $uri $uri/ /index.php?$query_string;
这里的
/index.php是服务器本地路径(指向public/index.php),不是暴露给用户的 URL 前缀。 -
❌ 错误理解:
- 把
rewrite ^/(.*)$ /index.php/$1 last;当成通用解——这会强制重定向,用户地址栏出现index.php,且易破坏POST数据或PATH_INFO; - 在浏览器里手动输
https://site.com/index.php/user/login——这属于绕过伪静态,不是配置目标。
- 把
注意:是否显示 index.php,只取决于两点:
- Nginx 是否成功把无
.php的请求转给了index.php(靠try_files); - ThinkPHP 是否能正确读取路径参数(靠
pathinfo_depr+PATH_INFO透传)。
只要这两项对齐,访问 /user/login 就能直达控制器,地址栏始终干净。
补充说明:
如果你发现某些链接仍带 index.php,常见原因不是规则“该不该加”,而是:
- 框架生成 URL 时用了
Url::build()但未启用url_domain_root或url_html_suffix配置; - 模板中手写了含
index.php的链接; - Nginx 没生效(没 reload)、或 root 指向错误(没指向
public/),导致框架根本没启动,Nginx 直接返回 404,浏览器自动补全为带index.php的尝试。
不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











