← 返回博客首页

HTTP 重定向全解:301/302/307/308 与 SEO 陷阱

一个改了域名就丢了搜索排名的故事

某网站把 example.com 全部迁到 example.net,用了平台默认的跳转。三个月后流量掉了一半——因为默认跳转是 302(临时),搜索引擎没有把旧域名的权重转移给新域名,反而认为这是临时的借用。一句话点破:永久改变用 301,临时借用用 302,要保方法用 307/308。本文把四者讲清,并带你避开 SEO 与表单跳转的坑。

四张状态码一张表

状态码 名称 语义 是否缓存 方法变化
301 Moved Permanently 永久 ✅(浏览器+SEO) POST→GET
302 Found 临时 历史实现 POST→GET
303 See Other 请用 GET 查看 有意转 GET
307 Temporary Redirect 临时且保方法 保持方法
308 Permanent Redirect 永久且保方法 保持方法

要点:301/308 会被缓存且是永久语义;302/307 不缓存是临时语义;303 明确“重定向后请用 GET”。最常踩的坑就是 301/302 把 POST 悄悄变成 GET。

Location 头与链条

重定向通过响应头告诉客户端要去哪:

HTTP/1.1 301 Moved Permanently
Location: https://new.example.com/path/to/page
  • 客户端必须读 Location 决定下一跳;
  • 相对 Location 会被按当前 URL 解析成绝对地址;
  • 一条链接可能经过多跳(A→B→C→最终),浏览器默认踩到底,但超过约 20 跳会放弃并报错
  • 链条越长,对用户与爬虫都越不友好(多一次往返),能用一条就达成的尽量一条。

SEO 陷阱:权重该不该转移

301 → 把旧地址的链接权重尽量转给新地址(推荐做永久迁移)
302 → 不转权重,只是临时借用(适合 A/B、上线过渡)
  • 大改版『内容不同』却 301 → 会被视为降级;
  • 全站 301 到首页 → SEO 视为死链聚合,宁可逐条映射;
  • 无法补齐的旧链接,至少保留 301 表并维护,别让地图上缺页。

重定向环:怎么回事

A→B→A、或 A→A 自指都是环。诱因多在中介层:尾斜杠规则、http/https 互跳、www 规范化、CDN 与源站规则打架。防御与排查:

# 观察跳到第几步回原点
curl -I -L --max-redirs 10 https://old.example.com

客户端一般自适应约 20 跳后放弃;服务端应在规范化后再决定是否跳,避免二义规则互踩。

自查

给下面三种需求各选一个状态码,并说明理由:

  1. 老页面全部移入 archive/,旧地址永久弃用;
  2. 上线前用新设计稿做一天灰度,随时可能回滚;
  3. 用户提交表单后跳转回列表页。

(答案:①301;②302 或 307;③303 或 307/302——前两者把权益/流程说清就够。)能把理由讲清,重定向的语义边界就过关了。

常见问题

301 和 302 到底差在哪?为什么 302 可能导致 POST 变 GET?

301 是**永久**重定向、302 是**临时**重定向,两者的关键差别在『语义』而非『表现』。**301 会被浏览器与搜索引擎缓存**:后续再访问原地址直接走新地址,且 POST 会被转换成 GET(语义上永久迁移,表单重复提交风险因此常在 301 上暴露)。**302 不缓存**,且历史实现经常把 POST 也转成 GET,导致表单/支付链接 POST 后变成 GET 丢参数。要‘临时但不改法’请看 307/308。选型口诀:永久迁移用 301(SEO 权重转移),临时跳转用 302/307,保留方法的临时跳转用 307,保留方法的永久跳转用 308,避免 POST 变 GET 用 307/308。

为什么我的重定向会把 POST 参数丢掉?

因为响应给的是 302 或 301,而客户端(尤其浏览器、curl 默认、老代理)把这次 POST 按『重定向 = 再发一次 GET』处理,POST 体与头自然没了。要保住方法只有两条:①服务端返回 **307**(临时、保留方法)或 **308**(永久、保留方法);②或用 303 明确『重定向后用 GET 查看』——303 是有意的转换而非『丢参数』。若你想稍后还能取到原数据,则别指望浏览器重放 POST,应把数据存到服务端会话、用带查询参数/片段的 GET 传给目标页。

重定向为什么会出现无休止死循环?怎么避免?

环的产生是 **Location 指向回到了同一条路径**:A → B → A,或重写规则把 A 又指回 A。常见诱因:①中间件给『所有路径加尾斜杠/去尾斜杠』而路径本身含反斜杠或其他被二次重写的字符;②协议/大小写规则(http↔https、www↔非 www)在已规范化的 URL 上又被重定向一遍;③CDN 回源与源站规则互相覆盖。预防:加**重定向计数守卫**(客户端/浏览器一般约 20 跳内报错),服务端用规范化后再判是否该跳;排查时抓 Location 链,用带 `-L --max-redirs` 的 curl 观察第几个跳回原点。

改版后的旧链接应该 301 还是 ?

**能用 301 就用 301**——如果旧地址彻底废弃、且新地址语义等价。301 会把旧页的**搜索引擎权重(链接权重)**尽量转移给新页,指标随新 URL 体现;302 不转移权重,只是临时借用,权重仍记在旧地址上,改版临时上线才用。但要注意三个前提:①内容确实**等价**(大改版内容不同直接用 301 会被认为降级);②逐条映射而非全站跳首页(跳首页的 301 会被 SEO 视为死链聚合);③把 301 写入 sitemap / 重定向表维护,避免旧链接在地图上成孤岛。

← 返回博客首页