HTTP 重定向解析

Posted 后端开发杂谈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP 重定向解析相关的知识,希望对你有一定的参考价值。

30x 重定向

关于重定向的 http code 主要有以下:

  • 301 Moved Permanently

301 状态码表明目标资源被永久的移动到了一个新的URI, 任何未来新对这个资源的引用都应该使用新的 URI.

服务器会在响应Header的Location字段中放上这个不同的URI(目标URI). 浏览器可以使用Location中 的URI进行自动重定向.

设置 Cache-Control 可以缓存301响应

  • 302 Found

302 状态码表示 目标资源 临时移动到另外一个URI上. 由于重定向是临时发生的, 所以客户端在之后 的请求中URI还应该使用原来的URI.

服务器会在响应Header的Location字段中放上这个不同的URI(目标URI). 浏览器可以使用Location中 的URI进行自动重定向.

注意: 历史的原因, 用户代理可能会在重定向后的请求中把POST方法改为GET方法. 如果不想这样, 应该 使用 307 (Temporary Redirect) 状态码.

设置 Cache-Control 可以缓存302响应

  • 303 See Other

303 状态码表示服务器要将浏览器重定向到另一个资源, 这个资源的URI会被写在响应Header的Location 当中. 从语义上讲, 重定向到的资源并不是你所请求的资源, 而是对你所请求资源的一些描述.

303 常用于将POST请求重定向到GET请求. 例如:上传文件成功后, 服务器发回一个303响应, 将你重定向到 一个上传成功的页面.

不管原请求是什么方法, 重定向的请求方法都是GET(或HEAD).

303 响应禁止被缓存.

  • 307 Temporary Redirect

307 的定义实际上和302是一致的, 唯一的区别在于, 307 状态码不允许浏览器将原本为POST请求重定向到 GET请求上. 即不允许修改请求方法.

  • 308 Permanently Redirect

308 的定义和301是一致的, 唯一的区别在于, 308状态码不允许浏览器将原本为POST去请求重定向到GET请 求上去. 不允许修改请求方法.

301 和 308 是永久重定向

302, 303, 307 是暂时重定向


302 303 307的区别 302 允许各种各样的重定向, 一般情况下都会实现为到GET的重定向. 但是不能确保POST会重定向为POST 303 只允许任意请求到(GET | HEAD)的重定向; 307 和 302 一样, (HEAD | GET | PUT | DELETE | POST), 除了不允许POST到GET的重定向.

301 308的区别 301 允许各种各种的重定向(HEAD|GET|PUT|DELETE). 但是不能确保POST会重定向为POST. 308 运行各种各样的重定向(HEAD | GET | PUT | DELETE | POST)

场景介绍

  • 使用 301 场景 (一般是资源位置永久更改)

  1. 换域名.

  2. HTTP -> HTTPS

  • 使用 302 场景 (一般是普通的重定向需求: 临时跳转)

  1. 未登录前使用302重定向到登录页面, 登录成功再跳回原来请求的页面

  2. 自动刷新页面. 比如5秒后返回订单详细页面之类

  http://t.cn/RuUMBnI -> miaopai.com 302

  http://t.cn/RuOcwxn -> video.weibo.com 301 -> miaopai.com 302

  1. 电脑端与移动端的转换

  https://www.taobao.com/ -> m.taobao.com 302



以上是关于HTTP 重定向解析的主要内容,如果未能解决你的问题,请参考以下文章

Linkedin OAuth 2.0 重定向 URL 不能包含片段标识符 (#)

HTTP 重定向解析

SpringMVC__配置视图解析以及服务端重定向和服务端跳转简单代码

Jsp获取Java的重定向赋值(String)

302 登录重定向后被 IE 删除的 URL 片段

解析 404 url​​ 并使用 nginx 重定向