永久重定向

这种重定向操作是永久性的。它表示原 URL 不应再被使用,而应该优先选用新的 URL。搜索引擎机器人会在遇到该状态码时触发更新操作,在其索引库中修改与该资源相关的 URL 。

编码 含义 处理方法 典型应用场景
301 Moved Permanently GET 方法不会发生变更,其他方法有可能会变更为 GET 方法。 网站重构。
308 Permanent Redirect 方法和消息主体都不发生变化。 网站重构,用于非GET方法。(with non-GET links/operations)

308 状态码被创建用来消除在使用非 GET 方法时的歧义行为。

临时重定向

有时候请求的资源无法从其标准地址访问,但是却可以从另外的地方访问。在这种情况下可以使用临时重定向。搜索引擎不会记录该新的、临时的链接。在创建、更新或者删除资源的时候,临时重定向也可以用于显示临时性的进度页面。

编码 含义 处理方法 典型应用场景
302 Found GET 方法不会发生变更,其他方法有可能会变更为 GET 方法。 由于不可预见的原因该页面暂不可用。在这种情况下,搜索引擎不会更新它们的链接。
303 See Other GET 方法不会发生变更,其他方法会变更为 GET 方法(消息主体会丢失)。 用于PUT 或 POST 请求完成之后进行页面跳转来防止由于页面刷新导致的操作的重复触发。
307 Temporary Redirect 方法和消息主体都不发生变化。 由于不可预见的原因该页面暂不可用。在这种情况下,搜索引擎不会更新它们的链接。当站点支持非 GET 方法的链接或操作的时候,该状态码优于 302 状态码。

307 状态码被创建用来消除在使用非 GET 方法时的歧义行为。

特殊重定向

除了上述两种常见的重定向之外,还有两种特殊的重定向。304 (Not Modified,资源未被修改)会使页面跳转到本地陈旧的缓存版本当中(该缓存已过期),而 300 (Multiple Choice,多项选择) 则是一种手工重定向:以 Web 页面形式呈现在浏览器中的消息主体包含了一个可能的重定向链接的列表,用户可以从中进行选择。

编码 含义 典型应用场景
300 Multiple Choice 不会太多:所有的选项在消息主体的 HTML 页面中列出。也可以返回 200 OK 状态码。
304 Not Modified 缓存刷新:该状态码表示缓存值依然有效,可以使用。

重定向是如何损伤性能

重定向结束之前没有任何资源返回给用户,它阻碍了整个 HTML 文档的传输。

重定向之外的选择

缺少结尾的斜线

URL 结尾的 / 如果没有,比如访问 https://www.yahoo.com/lifestyle/horoscope 会重定向到 https://www.yahoo.com/lifestyle/horoscope/。注意:当主机名后面缺少斜线时不会发生重定向。给主机添加结尾的 / 是一个默认默认行为。

重写后端接口

重写后端接口后,将用户从旧的 URL 转移到新的 URL 最简单的方法就是重定向,但是这样做会损害用户体验。如果域名变了,可以给域名配置一个 CNAME 让两个域名指向同一个服务器。

参考

【1】高性能网站建设指南:前端工程师技能精髓
【2】HTTP 的重定向 | MDN