toolfree

301 Moved Permanently

301 转址代表什么、和 302、307、308 差在哪里,以及为什么被转址的 POST 会变成 GET 抵达。

在你的浏览器中运行

点一下代码即可复制。

3xx · 重定向

你要的东西在别的地方,或是根本没有变过。

代码意义
Moved Permanently已经永久搬走了,请更新你的链接。301 和 302 允许客户端在重定向时把 POST 换成 GET,而浏览器确实会这么做。如果方法必须保留,请改用 308 或 307。
Found暂时在别的地方,请继续使用原本这个网址。
See Other请改用 GET 去取另一个网址——表单提交完成后最常见的响应。
Not Modified你缓存的版本仍然有效,不会回传主体。
Temporary Redirect暂时在别的地方,而且请求方法不能改变。
Permanent Redirect永久搬到别的地方,而且请求方法不能改变。

它说了什么

301 表示资源已经永久搬走,你应该更新所有指向旧地址的东西。新地址在 Location 头部里。

搜索引擎会照做:它们会把排名讯号转移到新网址,最终在索引中换掉旧的。这就是为什么网站换 域名或重整路径时,你要的是 301。

方法会被换掉的问题

这是真正会咬人的部分,而且知道的人不多。

**301 和 302 允许客户端更换方法。**跟随 301 的 POST 可能会被改成 GET 重新送出,而且不带 主体。规格出于历史因素允许这件事,浏览器也真的会做。所以用 301 去转址一个表单送出,等于 默默地把那次送出弄丢了。

**307 和 308 禁止这件事。**它们的意思分别和 302、301 完全相同,只是多了一项保证:方法与 主体会在转址后存活下来。

代码永久?保留方法?
301
302
307
308

规则很简单:只要请求有可能是 POST,就用 307 或 308。

303 是刻意反过来的那个

303 See Other 告诉客户端改用 GET 去取另一个地址,是刻意要换掉方法的。它是表单完成后正确 的回应:浏览器会停在一个可以安全重新整理的结果页,而不是被问要不要重新送出。

缓存,以及为什么 301 很难收回

浏览器会缓存永久转址,常常是无限期的,而且有时不会重新验证。一个指错地方的 301 可能在你 修好服务器很久以后,仍然留在访客的浏览器里,而你没有办法远端清掉它。

先用 302 测试,确定没问题之后再改成 301。反过来走的代价比听起来痛苦得多。

转址链

每多一跳就多一次来回,而浏览器和爬虫在几跳之后就会放弃。请直接转到最终地址,不要经过两层 中间规则——也记得检查你的主机自己加了什么,HTTP 转 HTTPS、以及裸域名转 www 常常会多出你 没写过的跳数。