thinkphp6中redirect()默认发送302临时重定向,适合调试与临时跳转;永久迁移需显式传入301状态码,如redirect('news/index', 301),且推荐在nginx层而非php层实现https强制跳转以避免缓存和循环问题。

ThinkPHP6中redirect()默认是302,不是301
直接调用redirect('news/index')或redirect('/admin')发出的都是302 Found响应,浏览器地址栏会变,但搜索引擎不会转移旧URL的权重。这是开发期默认行为,适合调试、A/B测试或临时下线页面。
如果你要永久迁移(比如把/article/list迁到/news/index),必须显式指定状态码:
redirect('news/index', 301)redirect(['controller' => 'News', 'action' => 'index'], 301)- 带参数时:
redirect('news/detail', ['id' => 123], 301)
注意:301响应会被浏览器和CDN强缓存,改错后清缓存很麻烦——建议先用302测试通再切301;上线后至少保留半年,否则百度可能不传递权重。
强制HTTPS跳转别在redirect()里硬写https://
很多人在中间件里写redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301),这有三个坑:
-
$_SERVER['HTTP_HOST']可能被伪造,$_SERVER['REQUEST_URI']不处理端口、编码、fragment(#后面部分) - 没过滤 CLI 或 AJAX 请求,命令行执行
php think queue:work会报错 - 本地开发环境(
localhost)也会跳,导致无法访问
正确做法是用框架内置方法拼接完整 URL:
if (!$request->isSsl() && $request->host() !== 'localhost' && !$request->isAjax()) {
return redirect($request->url(true), 301);
}
$request->url(true)会自动带上协议、域名、路径、查询参数和 fragment,且已做安全转义。
Nginx层做301跳转比PHP层更可靠
ThinkPHP本身不处理协议跳转,所有“强制HTTPS”逻辑都该由Web服务器承担。PHP层跳转晚于Nginx,容易引发循环(尤其开了CDN时),还可能污染缓存。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
在Nginx配置中单独开一个server块监听80端口:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
关键点:
- 必须用
return 301,不是rewrite——更快、无正则开销、不会触发location重匹配 -
$host保留原始域名(支持多域名),$request_uri完整保留路径+参数+编码 - 这个
server块要放在HTTPS的server块之前,否则可能不生效
如果用了CDN(Cloudflare/阿里云SLB),关掉CDN自带的“强制HTTPS”开关,只留Nginx这一层,避免叠加跳转导致ERR_TOO_MANY_REDIRECTS。
301跳转后Cookie和Session失效?检查secure标志
启用HTTPS后,如果用户还能通过HTTP访问,或跳转后登录态丢失,大概率是session.cookie_secure和cookie.secure没设为true。
在config/app.php里确认:
'cookie' => [
'secure' => true,
'httponly' => true,
'samesite' => 'Lax',
],
同时确保Nginx透传了X-Forwarded-Proto头(CDN/SLB环境下必需):
- 在
config/app.php中开启信任:'trust_proxy' => true - 并配置
'trust_proxies' => ['10.0.0.0/8', '172.16.0.0/12'](填你实际的代理网段)
否则$request->isSsl()永远返回false,secure Cookie不会发送,浏览器直接丢弃。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










