HTTP的重定向

11/2/2021 HTTP

关于重定向,最早了解是在HTTP状态码301和302的解释说明上,现在看来指的就是整个页面或应用被迁移到了一个新的URL下,并且老的URL依然保持有效,可以应用在

1、站点维护或停机时的临时重定向; 2、永久重定向将在更改站点的URL、上传文件时的进度页等之后保留现有的链接或书签; 3、上传文件时表示进度的页面。

# 原理

在HTTP协议中,重定向操作由服务器通过发送特殊的响应而触发。HTTP协议的重定向响应状态码为3xx。

在浏览器接收到重定向响应时,会采用该响应提供的新URL并立即进行加载;大多数情况下,除了会有一小部署的性能损耗之外,重定向操作对于用户来说是不可见的。

不同类型的重定向映射可以分为三个类别:

  • 永久重定向
  • 临时重定向
  • 特殊重定向

# 永久重定向

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

编码 含义 处理方法 应用场景
301 Moved Permanently get方法不会发生变更,其他方法有可能会变更为get方法 网站重构
308 Permanently Redirect 方法和消息主体都不发生变化 网站重构,用于非get方法

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

# 临时重定向

有时请求的资源无法从其标准地址访问,但是却可以从另外的地方访问。这种情况下可以使用临时重定向。

搜索引擎不会记录该新的、临时的链接。在创建、更新或删除资源的时候,临时重定向也可以用于显示临时性的进度页面。

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

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

# 特殊重定向

除了上述两种常见的重定向之外,还有两种特殊的重定向。304会使页面跳转到本地陈旧的缓存版本当中,而300则是一种手工重定向:以web页面形式呈现在浏览器中的消息主体包含了一个可能得重定向链接的列表,用户可以从中选择。

编码 含义 应用场景
300 Multiple Choice 不常用:所有的选项在消息主体的HTML页面中列出。鼓励在Link头部加入机器可读的 rel=alternate
304 See Other 发送用于重新验证的条件请求。表示缓存的响应仍然是新鲜的并且可以使用

# 设定重定向的其他方法

1、借助HTML的meta元素的HTML重定向机制; 2、借助DOM的javascript重定向机制。

# HTML重定向机制

HTTP协议中重定向机制是应该优先采用的创建重定向映射的方式,但是有时候web开发者对于服务器没有控制权,或者无法进行配置。针对这些特定的应用场景,web开发者可以在页面的 <head> 部分添加一个 <meta> 标签,并将其 http-equiv 属性的值设置为 refresh。当显示页面时,浏览器会检测该元素,然后跳转到指定页面。

<html>
  <head>
    <meta http-equiv="Refresh" content="0;URL=https://www.qq.com" />
  </head>
  ...
  ...
</html>
1
2
3
4
5
6
7

content 属性的值开头是一个数字,表示浏览器在等待该数字表示的秒数之后再进行跳转。

显然,该方法仅适用于HTML页面,并不能应用于图片或者其他类型的内容。

注意这种机制会使浏览器的回退按钮失效:可以返回含有这个头部的页面,但是又会立即跳转。

# JavaScript重定向机制

在JavaScript中,重定向机制的原理是设置 window.location 的属性值,然后加载新的页面。

window.location = "https://www.qq.com";
1

与HTML重定向机制类似,这种方式只有在支持JavaScript的客户端上才能使用。另一方面,它也提供了更多的可能性,比如只有在满足了特定的条件下才能出发重定向机制的场景。

Last Updated: 8/17/2022, 11:48:04 AM