thinkphp不提供全局301重定向开关,推荐优先在web服务器层配置;其次可用路由规则(如'/article/list'=>['news/index',301])或控制器redirect()方法实现单点301跳转,注意参数顺序与敏感数据规避。

ThinkPHP 本身不直接提供「全局 301 重定向」的配置开关,301 跳转需根据具体场景选择实现层级:路由规则重定向、控制器内主动跳转,或更推荐的 Web 服务器层配置。盲目在应用层硬写 301 容易引发循环跳转、SEO 混乱或代理环境下失效。
路由规则中配置 301 重定向
适用于旧 URL 永久迁移到新 URL 的 SEO 场景(如栏目改版、URL 规范化)。在 URL_ROUTE_RULES 中用数组格式声明,第二个元素传状态码:
- '/article/list' => array('news/index', 301) → 访问 /article/list 永久跳转到 /news/index
- '/Home/Index' => array('/home/index', 301) → 强制小写化并 301
- '/old-page.html' => array('https://example.com/new-page', 301) → 跳转到外部地址
注意:该方式仅对匹配到的路由生效,不覆盖全站;且要求 URL_ROUTER_ON = true。
控制器中用 redirect() 发送 301
适合单点逻辑控制(如某操作完成后的永久归档页):
-
TP5/6 写法:
return redirect('user/profile', ['id' => 123], 301); -
TP3.2 写法:
$this->redirect('user/profile', array('id'=>123), 0, '', 301);(TP3 中第 5 参数为 code)
⚠️ 关键提醒:不要把延时值(如 3)误当状态码传——TP6+ 中 delay 已移除,TP3 中 delay 是第 3 参数,code 是第 5 参数,错位会导致跳转异常或返回错误状态。
Web 服务器层强制 HTTPS 或全站 301(最推荐)
ThinkPHP 不应承担全站协议或路径重定向职责。Nginx/Apache 配置更安全、高效、可靠:
-
Nginx(HTTP → HTTPS):
server { listen 80; return 301 https://$host$request_uri; } -
Nginx(路径规范化):
rewrite ^/([A-Z])/(.*)$ /strtolower($1)/$2 permanent;(需配合 map) -
Apache:
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
✅ 优势:不经过 PHP 解析、不依赖 $_SERVER 变量、避免代理头污染、CDN 友好;❌ 应用层做等效操作极易出错(如未过滤 localhost、未判别 CLI 请求、未处理 X-Forwarded-Proto)。
敏感参数别走 301 URL
301 响应会被浏览器和 CDN 缓存,若 URL 含订单号、金额等,将长期暴露在历史记录与日志中。正确做法:
- 非敏感参数(如 page=2、q=搜索词)可放心放 URL,支持分享和缓存
- 敏感数据一律改用 session 闪存:
session('order_data', $data); return redirect('pay/confirm'); - 目标动作中立即读取并清空:
$data = session('order_data'); session('order_data', null);
不复杂但容易忽略:301 是“永久”承诺,改错一次,搜索引擎可能数月难恢复。确认迁移无误再上线。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











