<!doctype html><html><head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,maximum-scale=1,user-scalable=no"/> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> <meta name="renderer" content="webkit"/> <meta http-equiv="refresh" content="0;url=static/ck600mgr/pages/index.html"> <title></title></head><body></body></html>

301,302,303,307

301是永久重定向,常用的场景是利用域名跳转。

比如,我们访问 http://www.zhihu.com 会跳转到 https://www.zhihu.com,发送要求之后,就会返回301状态码,然后返回一个location,提示新的地址,浏览器就会拿着这个新的地址去访问。

html重定向页面html网页重定向的方法 GraphQL

301.png

302是临时重定向,用来做临时跳转。
接着上面的例子,重定向到 https://www.zhihu.com 的要求又会通过302重定向到 https://www.zhihu.com/signup?next=%2F

302.png

不过,看上去301和302都是代表重定向的意思。
那详细有啥差异呢?

http 1.0规范中有2个重定向——301和302,在http 1.1规范中存在4个重定向——301、302、303和307。

个中301在http 1.0以及http 1.1中都表示永久重定向,就不谈论了。

那302呢?

在http1.0中,302的规范是这样的:

原要求是post,则不能自动进行重定向;原要求是get,可以自动重定向。

但是浏览器和做事器的实现并没有严格遵守HTTP中302的规范,做事器不加遵守的返回302,浏览器即便原要求是post也会自动重定向,导致规范和实现涌现了二义性。

以是HTTP 1.1中将302的规范细化成了303和307

303和307

继续了HTTP 1.0中302的实现(即原要求是post,大概可自动进行重定向,结果是无论原要求是get还是post,都可以自动进行重定向)。

307则继续了HTTP 1.0中302的规范(即如果原要求是post,则不许可进行自动重定向,结果是post不重定向,get可以自动重定向)。