301 Moved Permanently
301 转址代表什么、和 302、307、308 差在哪里,以及为什么被转址的 POST 会变成 GET 抵达。
在你的浏览器中运行
点一下代码即可复制。
你要的东西在别的地方,或是根本没有变过。
| 代码 | 意义 |
|---|---|
| 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 常常会多出你 没写过的跳数。