301是永久重定向,302是临时重定向;301缓存跳转、更新书签、传递seo权重,适用于域名迁移等长期变更;302不缓存、不更新、不传权重,适用于维护、测试等短期场景。

301 和 302 都是 HTTP 重定向状态码,但它们在语义、浏览器行为、搜索引擎处理和实际用途上完全不同。选错一个,轻则调试困难,重则 SEO 权重丢失、缓存混乱、用户反复跳转。
301 是永久重定向,告诉所有人“这里永远搬走了”
浏览器收到 301 响应后,会把原 URL 和新 URL 的映射关系缓存下来。下次再访问原地址,甚至不发请求,直接跳转到新地址——书签、历史记录、自动补全都会更新。搜索引擎也会逐步把旧 URL 的排名、外链权重、收录全部迁移到新地址,并最终剔除旧 URL。
- 适用于域名迁移(old.com → new.com)
- HTTPS 强制跳转(http → https)
- URL 结构调整(/article/123 → /blog/123)
- www 与非 www 统一(example.com → www.example.com)
302 是临时重定向,表示“我暂时去别处待会儿”
浏览器每次访问原 URL 都会重新向服务器发起请求,确认是否还要跳转;它不会缓存跳转路径,也不会更新本地记录。搜索引擎继续抓取和索引原 URL,新地址仅作快照,不参与排名,链接权重基本不转移。
- 适用于灰度发布或 A/B 测试
- 临时维护页(如跳转至 /maintenance.html)
- 根据用户地域或设备动态跳转
- 短链服务或活动推广页(短期有效)
Nginx 中最稳妥的配置写法
推荐优先使用 return 指令,简洁、高效、语义明确,避免 rewrite 的隐式行为和 flag 陷阱。
- 301 永久跳转:
return 301 https://new.com$request_uri; - 302 临时跳转:
return 302 https://temp.com$request_uri; - 注意
$request_uri会完整保留路径和查询参数(如 ?id=123) - 不要混用 rewrite + permanent/redirect:rewrite 的 permanent 实际也发 301,但逻辑更绕,易出循环跳转
容易踩坑的关键细节
很多问题不是配置写错了,而是没理解重定向背后的机制。
- 测试阶段务必先用 302:避免浏览器缓存 301 导致改了配置也跳不动,调试完再切 301
- 检查是否形成循环:比如 old.com → new.com,而 new.com 又反向跳回 old.com
- HTTPS 迁移时,确保监听 443 端口的 server 块不重复跳转,否则可能触发安全警告
- 搜索引擎识别需要时间,上线 301 后建议用 Google Search Console 观察“覆盖率报告”和“旧 URL 是否被标记为‘已重定向’”











