thinkphp 8 伪后缀路由需同时满足 nginx 正确传参(/index.php?s=$uri&$args)、框架开启 url_html_suffix 并配置 url_route_on=true、入口路径与 script_filename 匹配三条件,缺一不可。

ThinkPHP 8 支持伪后缀路由(如 /user/list.html),但需同时满足 Nginx 配置、框架参数和入口路径三方面要求,缺一不可。
1. Nginx 必须保留原始请求路径中的后缀
默认 try_files $uri $uri/ /index.php?$query_string; 会把 /user/list.html 当作真实文件尝试匹配,找不到就直接 fallback 到 index.php,但此时 $query_string 不含 .html,框架收不到后缀信息。
正确做法是让 Nginx 把完整 URI(含后缀)传给 PHP,用 s= 参数显式传递:
-
在 location / 块中使用:
try_files $uri $uri/ /index.php?s=$uri&$args; -
&是 HTML 实体写法,Nginx 配置里必须写成&,不能写&,否则nginx -t报错 - 确保
root指向public/目录,例如:root D:/www/myapp/public;
2. ThinkPHP 8 需启用并适配伪后缀
仅 Nginx 传参还不够,框架必须能识别并剥离后缀。检查 config/app.php:
-
'url_route_on' => true(路由必须开启) -
'url_html_suffix' => '.html'(设为你实际使用的后缀,可填'.htm|.html|.shtml'多个,用竖线分隔) -
'pathinfo_depr' => '/'(保持斜杠分隔,与 URL 结构一致) - 确认未禁用
think\middleware\ParseUrl::class中间件(TP8 默认启用)
3. 入口文件与自动加载路径要匹配
伪后缀本身不改变物理路径,但若 root 错位或 SCRIPT_FILENAME 拼错,会导致框架连 autoload 都加载失败,页面空白且无报错:
-
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;(必须用$realpath_root,不是$document_root) - 确保
location ~ \.php$块中包含:fastcgi_param PATH_INFO $fastcgi_path_info;<br> fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
- 如果用了子目录部署(如
https://site.com/app/),fallback 路径要同步加前缀:/app/index.php?s=$uri&$args;
4. 验证是否生效
改完配置后执行:nginx -t && nginx -s reload,然后测试:
- 访问
/index/hello.html→ 应触发Index/hello方法 - 访问
/index/hello?name=tp8→$_GET['name']和路由参数都应可用 - 查看 Nginx error.log,确认无
Primary script unknown或FastCGI sent in stderr
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











