301是永久重定向,表示资源已永久迁移,浏览器和搜索引擎会缓存新地址并转移权重;302是临时重定向,表示资源仅暂时变更,原URL仍有效,不缓存、不传递权重。

301 和 302 是 HTTP 协议中两个最常被误用的重定向状态码。选错一个,轻则用户反复跳转、页面刷新丢数据,重则 SEO 权重清零、旧链接流量归零、搜索引擎长期索引错误地址。关键不在“能不能跳”,而在“浏览器和搜索引擎怎么理解这次跳”。
语义决定行为:永久迁移 vs 临时改道
301 表示“这里永远搬走了”,302 表示“我暂时去别处待会儿,马上回来”。这个基本判断直接触发后续所有连锁反应:
- 浏览器看到 301,会自动更新历史记录、书签、地址栏自动补全,并把跳转关系缓存下来——下次访问原 URL,甚至不发请求,直接跳新地址。
- 浏览器看到 302,每次都会老老实实向服务器发一次请求,确认“还在不在那儿”,再决定是否跳;它不会更新任何本地记录,也不会缓存跳转路径。
- 搜索引擎爬虫对 301 会逐步把旧 URL 的收录、排名、外链权重迁移到新 URL,并最终剔除旧地址;对 302 则完全无视迁移,坚持抓取原 URL,新地址仅作快照,不参与排名竞争。
什么情况必须用 301?
当变更不可逆、原路径已废弃、你希望用户和搜索引擎彻底切换到新位置时,只应使用 301:
- 域名更换(如 oldsite.com → newsite.com)
- 全站 HTTPS 升级(http:// → https://)
- URL 结构重构(/blog/post-123.html → /articles/2026/my-first-post)
- 统一访问入口(裸域名 example.com 自动跳转到 www.example.com,或反之)
- 网站合并或栏目下线后,将整块流量导向替代页面
什么情况只能用 302?
当跳转只是过渡手段、原地址仍需保留、未来可能随时恢复时,必须用 302:
- 未登录用户访问个人中心,跳转至登录页(登录成功后应返回原页面)
- 后台维护期间,全站临时跳转至公告页
- A/B 测试中将部分用户导流至新版本页面,但主流量仍走原路径
- 促销活动页上线期间临时承接流量,活动结束后自动失效
- 需要保持 POST 请求方法不变时,应改用 307(302 会强制转为 GET,易丢失表单数据)
配置时容易踩的坑
写对状态码只是第一步,实现细节出错照样失效:
- Nginx 中 rewrite 指令后跟 permanent 才是 301,跟 redirect 才是 302;写成
rewrite ... last或漏掉 Location 头,会导致 301/302 不生效或降级为内部跳转。 - 后端代码中用
Response.Redirect()默认发 302;要发 301,必须显式设置状态码为"301 Moved Permanently"并添加Location响应头。 - CDN 或反向代理层若缓存了 301 响应,后续修改配置可能完全不生效——得主动刷新边缘节点缓存,否则用户持续跳错地址。
- 测试时别只看浏览器地址栏变没变,要用开发者工具 Network 面板确认响应状态码和 Location 头是否准确,避免被浏览器强缓存误导。

















