伪静态配置失败主因是入口位置、路由开关、服务器模块未对齐;thinkphp 6 需确保 index.php 在 web 根目录、开启 url_route_on、nginx 补全 path_info、清除 runtime 缓存。

伪静态配不上,八成不是规则写错了,而是入口位置、路由开关、服务器模块三者没对齐。上传后 404 或跳回 index.php?s= 形式,基本可锁定这三点。
ThinkPHP 6 的入口文件必须在 Web 根目录
TP6 默认把 index.php 放在 public/ 子目录下,但共享主机或宝塔默认站点根目录指向项目顶层(比如 /www/wwwroot/myapp/),这时直接访问会报 404 —— 因为 Web 服务器根本找不到 public/index.php。
- 正确做法:把
public/里所有内容(index.php、.htaccess、static/)挪到网站根目录;其余目录(app/、config/、runtime/)移到根目录的上一级或同级但不可访问路径 - 同步修改
index.php中的自动加载路径:__DIR__ . '/../vendor/autoload.php'和__DIR__ . '/../thinkphp/base.php'要能实际定位到文件,否则直接白屏或 500 - 如果主机禁用跨目录包含(
open_basedir限制),只能把所有目录平铺在根目录下,再靠.htaccess拦截敏感目录(如Deny from all放在runtime/.htaccess里)
Apache 的 .htaccess 规则要精简,别照抄 TP 官方模板
共享主机普遍禁用 AllowOverride 或只允许基础指令,官方 .htaccess 里带 Header set、Expires、RewriteCond 嵌套过深,一启用就 500。
- 只保留最简重写逻辑:
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L] - 删掉所有
Header、php_flag、Options类指令 - LiteSpeed 用户注意:
[L]可能不识别,换成[END]或直接去掉 - 验证是否生效:新建一个
.htaccess,内容仅RewriteRule ^test$ /index.php [L],访问/test看是否跳转
Nginx 伪静态必须补全 PATH_INFO,否则路由全失效
TP6 默认走 PathInfo 模式(如 /index/index),但 Nginx 不像 Apache 自动拆解 PATH_INFO,缺了关键参数,input() 拿不到路由段,url() 生成也错乱。
- 必须在
location ~ \.php$块里显式设置:fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param PATH_INFO $fastcgi_path_info;
- 如果部署在二级目录(如
/myapp/),rewrite目标要带前缀:rewrite ^/myapp/(.*)$ /myapp/index.php?s=$1 last; - 宝塔用户注意:内置「ThinkPHP」伪静态规则是为 TP5 设计的(匹配
s=参数),TP6 开启路由后默认不带s=,得手动改成 PathInfo 兼容版或关掉预设规则,自己写
路由和 URL 配置必须开,且不能依赖“自动适配”
伪静态只是 URL 表面好看,真正起作用的是框架内部的路由解析。很多上传后仍出 index.php?... 的情况,是因为配置根本没生效。
- 确认
config/app.php中已开启:'url_route_on' => true,'url_html_suffix' => 'html'(如果用了后缀) -
app_host和url_domain_deploy这两个配置只影响url()函数生成链接,对请求解析完全无效,调它们解决不了 404 -
多语言场景下,别在路由规则里硬编码语言标识(如
zh/),应统一用lang参数 + 中间件切换,否则伪静态规则会随语言变复杂,维护成本陡增
最容易被忽略的点是:上传后没清空 runtime/cache/ 和 runtime/route/,旧缓存残留会导致路由表不更新,改了规则也不生效。上传完务必手动删掉整个 runtime/ 目录(确保它可写且不在 Web 可访问路径下)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











