TP6路由SEO友好性更强,因其默认开启url_domain_deploy、支持语义化路径、显式pattern约束、404正确返回及SCRIPT_NAME精准配置,而TP5.1易出现URL混乱、状态码错误和路径解析偏差。

ThinkPHP 6 路由 SEO 友好性比 TP5 强在哪
TP6 默认开启 url_domain_deploy 和更灵活的路由分组机制,让 route:list 输出的规则天然支持语义化路径(比如 /article/2024/04/15/title-slug),而 TP5.1 的 Route::rule() 在闭包式定义下容易漏掉 complete_match 配置,导致搜索引擎抓取到带多余斜杠或参数顺序错乱的 URL。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- TP6 中优先用
Route::get()+pattern()显式约束变量格式,避免:id匹配到含字母的脏数据被误收录 - TP5.1 若必须用,务必在
route.php末尾加Route::miss(function () { return response('', 404); });,否则 404 页面返回 200 状态码,SEO 会当有效内容抓 - 所有路由定义里禁用
[:ext]这类通配后缀——Google 已明确表示不索引带问号或点号后缀的 URL
Apache 伪静态规则中 RewriteCond 的坑
常见错误是直接套用 ThinkPHP 官方文档里的 RewriteCond %{REQUEST_FILENAME} !-d,结果在子目录部署(如 https://example.com/app/)时,%{REQUEST_URI} 带前缀但 %{REQUEST_FILENAME} 不带,条件永远为真,所有请求都进 index.php,连 favicon.ico 都 500。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 子目录部署必须加
RewriteBase /app/(替换成你的实际路径),且RewriteCond改用%{REQUEST_URI}判断,例如:RewriteCond %{REQUEST_URI} !^/app/(public/|\.).* - 别信 “去掉 .htaccess 就能提速” —— Apache 2.4+ 开启
AllowOverride None后,index.php里$_SERVER['PATH_INFO']会为空,路由直接失效 - 测试时用
curl -I https://yoursite.com/test看HTTP/1.1 200 OK和X-Powered-By头是否正常,别只看浏览器页面
Nginx 下 fastcgi_param SCRIPT_NAME 的值必须对齐入口文件路径
很多 Nginx 配置把 fastcgi_param SCRIPT_NAME /index.php; 写死,但实际项目入口可能是 /public/index.php 或 /subdir/public/index.php。值不对会导致 TP 解析 REQUEST_URI 时多截一段,路由匹配失败,URL 变成 /index.php/article/123 这种非 SEO 友好形式。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 入口文件在
/public/index.php,就写fastcgi_param SCRIPT_NAME /public/index.php;;在根目录就写/index.php - 如果用了二级目录(如
https://a.com/blog/),Nginx 的location必须带前缀,且SCRIPT_NAME要对应,例如:location /blog/ {<br> alias /var/www/blog/public/;<br> fastcgi_param SCRIPT_NAME /blog/index.php;<br>} - TP6.1+ 可临时加日志验证:
Log::write('SCRIPT_NAME: ' . $_SERVER['SCRIPT_NAME'], 'debug');,部署后立刻查日志确认值是否合理
动态生成的 URL 总是带 index.php?检查 config/app.php 的 url_common 设置
TP 默认开启 url_common(兼容模式),即使伪静态生效,url() 函数仍会输出带 index.php 的链接。这不是路由问题,是配置开关没关。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 确保
config/app.php中'url_common' => false,,且'url_html_suffix' => 'html'这类后缀设为空字符串(''),否则生成的 URL 末尾多出 .html,百度会当成不同页面重复收录 - 模板里别用
__ROOT__/index.php?s=xxx拼接,一律用{:url('article/read', ['id'=>123])},TP 会自动按当前环境补全协议、域名和路径前缀 - 上线前用
php think build --config检查配置是否被环境变量覆盖,有些服务器会把.env里的APP_URL错误注入到路由生成逻辑中
路由规则本身不难写,难的是每次换服务器、改目录、切环境时,SCRIPT_NAME、REQUEST_URI、url_common 这三个地方总有一个悄悄变样,然后 SEO 流量就断得无声无息。



















