4

http状态码是web开发中经常会用到的一个东西,前几天无意中看到一个url返回一个307的状态码,我一眼看着挺新鲜,就搜刮了一下相关知识,发现还挺有用,特此记录。

3xx的状态码都是重定向,那么307,303,302的重定向都有啥区别捏,我们先看一下各自的定义

307 Temporary Redirect

请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

新的临时性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。因为部分浏览器不能识别307响应,因此需要添加上述必要信息以便用户能够理解并向新的URI发出访问请求。

如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。

303 See Other

对应当前请求的响应可以在另一个URI上被找到,而且客户端应当采用GET的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。这个新的URI不是原始资源的替代引用。同时,303响应禁止被缓存。当然,第二个请求(重定向)可能被缓存。

新的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。

注意:许多HTTP/1.1版以前的浏览器不能正确理解303状态。如果需要考虑与这些浏览器之间的互动,302状态码应该可以胜任,因为大多数的浏览器处理302响应时的方式恰恰就是上述规范要求客户端处理303响应时应当做的。

302 Found

请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。

新的临时性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,否则响应的实体中应当包含指向新的URI的超链接及简短说明。

如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化。

注意:虽然RFC 1945和RFC 2068规范不允许客户端在重定向时改变请求的方法,但是很多现存的浏览器将302响应视作为303响应,并且使用GET方式访问在Location中规定的URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。

咋一看主要区别如下:

302是http1.0的协议状态码,在http1.1版本的时候为了细化302状态码又出来了两个303和307,

你可以理解为303就是我们之前的302干的事情,临时重定向。

307有点意思:

如果这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非得到用户的确认,因为请求的条件可能因此发生变化

不是get或head,那比如我们提交一个post会怎么样。我做了个测试,demo地址点击这里

我有四个表单,分别测试303和307的get和post请求,他们都会重定向到同一个url(target.php),这个php会打印出所有的请求参数

我把四个结果截图如下

303post截图如下

TB1SjbtQXXXXXhttps://img.alicdn.com/tfs/TB1SjbtQXXXXXaqXFXXXXXXXXXX-2220-1238.jpgaqXFXXXXXXXXXX-2220-1238.jpg

303get截图如下

![
clipboard.png
][2]

307post截图如下
![
clipboard.png
][3]

307get截图如下

![
clipboard.png
][4]

结语

**303重定向不会自动吧get,post的请求带到目标url去。
307重定向会把post的请求自动带到目标url,而对于get请求307也不会把参数带过去**

原文见这里


小无路
221 声望6 粉丝

小小小前端