`
no7beckham
  • 浏览: 95349 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

重定向 3xx 系列状态码

阅读更多
3xx 系列状态码一般是用来作为重定向的,并且在重定向的过程中,一般不需要用户的参与,也就是说,重定向的过程是由浏览器来控制的。但是如果重定向后的请求的方法不是 GET 或 HEAD 的话,还是需要用户参与的,不过也许仅仅是确认一下是否同意发送数据而已:)

另外,开发者要注意的是,RFC2616 Section 10.3external link 的备注中提到了在前一版本的 HTTP 协议中建议最大重定向次数为 5 次,也就是说,客户端可能只跟踪 5 次重定向,如果超过 5 次重定向,那么可能客户端就会把第 5 次重定向后得到的结果做为最终结果。这时,客户端得到的可能就是一个错误的结果,这就是开发者不愿看到的,那么在开发时,就应该尽量控制重定向次数在 5 次以内。

5.1  300 Multiple Choices

300 Multiple Choices,字面意思是多重选择,表示请求的这个地址具有多个资源可以响应。客户端在遇到 300 Multiple Choices 时,可以自动选择一个最适合的转向地址,或者将所有选项提供给用户由用户来选择一个最适合的转向地址。

除非客户端使用 HEAD 方法来请求,那么如果服务端要返回 300 状态码,那么也应该同时在响应中指出所有可以选择的转向地址列表以便客户端进行选择。但是,目前这个列表的格式并没有一个统一的规范,所以需要客户端与服务端统一规范。

我觉得这个状态码可以用于镜像选择,客户端向服务器请求一个资源,服务器返回一个所有候选资源的列表,客户端从中选取一个速度最快的镜像进行资源下载。

如果没有客户端与服务端之间没有统一规范哪一个资源才是最适合的选择,那么服务端最好在头部中添加 Location 字段指明以服务端来考虑的最适合的转向地址,客户端可以直接使用 Location 字段中的转向地址进行转向而不需要考虑候选资源列表格式是怎么样的或者哪一个选择才是最好的。

经过测试,目前流行的浏览器中,只有 IE 和 Firefox 会对 300 状态码进行识别,Safari、Opera、Chrome 均直接显示响应的内容。由于前面说过的原因,候选列表的格式没有一个统一的规范,所以 IE 和 Firefox 只会根据 Location 字段的值进行转向,如果不指定 Location 字段的值,那么 IE 和 Firefox 也会跟其他浏览器一样只显示响应的内容。

5.2  301 Moved Permanently

在诸多 SEO 的文章中所说的永久转向就是这位 301 Moved Permanently 了。301 表示当前请求的资源永久地被转移到一个新的 URI 了,除非请求的方法是 HEAD,这个新的 URI 必须在头部的 Location 字段中指出,同时响应内容中最好包含一个指定新地址的超链接,这样,在不支持自动转向的浏览器用户也可以通过点击超链接来重定向到新的 URI。

如果请求时所用的方法不是 GET 或者 HEAD,那么客户端在用户确认前不应自动进行重定向。例如如果浏览器发送了一个 POST 请求,但是收到了 301 Moved Permanently 的响应,那么在重定向到新的 URI 时,可能会使用 GET 方法来请求而不是 POST 方法。

事实上,测试表明,目前的主流浏览器都不会直接重发 POST 请求到 301 重定向后的 URI,而是将请求转换成 GET 方法后再发送,也就是说,在 301 重定向到的服务端程序中,是接收不到最开始客户端 POST 的数据。

5.3  302 Found

302 Found 常用于客户端重定向,例如登录完成后重定向到首页等。它表示的是临时重定向,虽然用得多,但是在对于搜索引擎而言却是一个不太友好的东西,所以尽量只在临时转向时才用它。

302 Found 的用法跟 301 Moved Permanently 一样,在 Location 字段中指出要转向的地址,只是所包含的含义不一样而已。

5.4  303 See Other

上面提到了 303 和 307 是用来解决重定向是否要重发 POST 数据不清晰的问题,其中 303 就是用来表示客户端不需要重新发送 POST 数据,可以使用 GET 方法来请求新的地址。

要注意的是,303 响应中 Location 指出的地址并不是原请求地址的完整响应,也就是说,303 可能只是个说明页面,并不一定会对原来请求做出正确的响应。

备注中说一些以前的 HTTP 1.1 客户端可能不认识 303,不过现在可以放心的是,主流浏览器都是支持 303 状态码的。

5.5  304 Not Modified

304 Not Modified 是用来表示客户端所请求的资源和上次所请求时没有发生改变,这样服务端就不用重新发送资源的内容,从而减少了网络的负担。

服务端可以由两个头部变量来判断是否发送 304 Not Modified 状态码,一个是 If-Modified-Since,另一个是 If- None-Match,相对应的服务端需要发送的头部变量是 Last-Modified 和 ETag。可以二者选其一,也可以两个都用。

5.6  305 Use Proxy

305 Use Proxy 指示客户端需要通过代理来请求当前资源,在头部的 Location 字段中指定代理地址,并且这个状态码只能由原始服务器返回。

但是 RFC 2616 Section 10.3.6external link 中并没有详细指出 Location 的格式是怎么样的,通过测试发现只有 Safari 会识别 305 Use Proxy,并且直接转向到 Location 中指定的地址。

暂且把它当做一个转向的状态码来用吧,嗯,尽量少用吧,许多浏览器不认识它。

5.7  306 (Unused)

HTTP 1.1 中把它给扔了,所以我们不用管这个状态码了,如果碰到了,直接当错误处理吧。

5.8  307 Temporary Redirect

唔,又是一个不被完全支持的状态码。客户端收到这个状态码时,应该将请求重发到新的地址。而且这个状态码,主要用于 POST 请求,因为如果原始请求是用 GET 方法发送的,那么很可怜的在重定向到新的地址以后,GET 参数会全部舍弃,如果需要在转向后的地址处理 GET 参数,那么自己在服务端程序中加上去吧……

测试中只有 Firefox、Opera 和 IE 会将 POST 请求重定向到新的地址,其中 Firefox 和 Opera 会让用户选择是否重新发送表单到新的地址,而 IE 则是不经用户选择直接把表单重新发送到新的地址,相对而言,Firefox 和 Opera 更安全一些。

如果一定要用这个状态码,为了兼容那些个不认识它的浏览器,服务端需要在响应内容中加个指向新地址的超链接,再加个说明啥的,说明一下怎么用这个新的地址。anyway,少用为上。

后记

3xx 重定向系列用得相当广泛,301、302、304 这三个用得最多。特别需要注意的是 POST 的数据在目前来说基本上是无法直接重定向到一个新的地址的。

ps. 用好 304 很重要:)
分享到:
评论

相关推荐

    HTTP状态码详细分解

    针对HTTP状态码:1xx,2xx,3xx,4xx,5xx的几十个状态码做了详细分析, 以及出现状态码代表了什么意思,个别的详细解释了出现的原因。供大家针对出现的问题思考解决方案;例如:300错误为:针对收到请求,服务器可执行...

    ajax状态码总结

    HTTP 状态码分为五大类:信息响应类(1xx)、处理成功响应类(2xx)、重定向响应类(3xx)、客户端错误类(4xx)和服务端错误类(5xx)。 1xx 信息响应类 * 100:客户端必须继续发出请求 * 101:客户端要求服务器...

    Web应用安全:HTTP状态码.pptx

    HTTP状态码 HTTP状态码的作用是:Web服务器用来告诉客户端,发生了什么事。 状态码位于HTTP Response 的第一行中,会返回一个”三位数字的状态码“和一个“状态消息”。 ”三位数字的状态码“便于程序进行处理...3、1XX

    http协议状态码的含义及解决方法

    3xx 重定向 * 300:针对收到请求,服务器可执行多种操作。 * 301:永久移动转移,请求的内容已永久移动其他新位置。 * 302:临时移动转移,请求的内容已临时移动新的位置。 * 304:未修改。自从上次请求后,请求的...

    http响应状态码

    响应码分五种类型,由它们的第一位数字表示:1xx:信息,请求收到,继续处理2xx:成功,行为被成功地接受、理解和采纳3xx:重定向,为了完成请求,必须进一步执行的动作4xx:客户端错误,请求包含语法错误或者请求...

    HTTP状态码表示意思

    HTTP 状态代码的完整列表 1xx(临时响应) 用于表示临时响应并需要请求者执行操作才能继续的状态代码。 代码 说明 100(继续) 请求者应当继续提出请求。服务器返回此代码则意味着,服务器已收到了...3xx(已重定向)

    HTTP服务器状态码定义.doc

    1.3 重定向(Redirection 3xx) 该类状态码表示用户代理要想完成请求,还需要发出进一步的操作。这些操作只有当后 跟的请求是GET或HEAD时,才可由用户代理来实现,而不用与用户进行交互。用户代理永 远也不要对请求...

    HTTP中的重定向

    概念 URL 重定向,也称为 URL 转发,是一种当实际资源,如单个页面、表单或者整个 Web 应用被迁移到新的 URL 下的时候,保持...HTTP 协议的重定向响应的状态码为 3xx 。浏览器在接收到重定向响应的时候,会采用该响

    Gy-coder#frontend-offer#HTTP状态码1

    http 状态码分为 5 类信息响应(1xx)成功响应(2xx)重定向(3xx)客户端错误(4xx)服务器错误(5xx)具体解释这个临时响应表明迄今为止所有的内

    IOS HTTP请求的常见状态码总结

    由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试验条件下,服务器禁止向此类客户端发送1xx响应。 这些状态码代表的响应都是信息性的,标示客户应该采取的其他行动。 100 Continue  客户端应当继续发送...

    http协议的状态码200、301、304、404、502一览.docx

    重定向(3xx) * 300 Multiple Choices:服务器可以执行多种操作,客户端可以选择一种操作。 * 301 Moved Permanently:服务器返回此响应时,会自动将客户端转到新位置,用于告知客户端某个网页或网站已经永久移动...

    http请求和响应格式

    3. 3xx:重定向状态码,表示请求需要进一步处理。 例如:301 Moved Permanently,表示资源已被永久重定向。 例如:302 Found,表示资源已被临时重定向。 4. 4xx:客户端错误状态码,表示请求错误。 例如:400 ...

    搜狐畅游笔试题

    * HTTP 状态码的分类:成功(2xx)、重定向(3xx)、客户端错误(4xx)、服务器错误(5xx) * 常见的 HTTP 状态码:200、302、304、404、500、503 * HTTP 状态码在网站访问日志中的应用:可以判断网站访问的状态和...

    求职有道-接口测试面试题

    常见的状态码有哪些?分别代表什么含义? 1XX: 表示正在请求 2XX: 请求成功 200 3XX: 表示重定向 当前请求的页面再得到响应之后,不在当前页面停留,直接跳转到其他重定向的页面 4XX: 客户端错误 ...

    TCP-HTTP-操作系统.pdf

    状态码 2xx:表示报文被成功接收 3xx:表示重定向,客户端重新发起请求 301永久重定向,302临时重定向 304资源为修改,读取缓存 4xx:客户端错误,服务器无法处理 403服务器禁止访问 404资源没有在服务器找到 5xx:...

    http status 类型大全

    1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态码 2xx (成功) 表示成功处理了请求的状态码。 3xx (重定向) 要完成请求,需要进一步操作。通常,这些状态码用来重定向。Google 建议您在每次请求中...

    HTTP 响应码和Header信息介绍文档

    3xx:重定向,为了完成请求,必须进一步执行的动作 4xx:客户端错误,请求包含语法错误或者请求无法实现 5xx:服务器错误,服务器不能实现一种明显无效的请求 常见的 HTTP 响应码包括: * 100 继续 * 200 OK * 201...

    Rest-api:试验REST API

    REST API 这是一个用于测试REST API,它们... 1XX-信息性2XX-成功3XX-重定向4XX-客户端错误5XX-服务器错误以下是与REST一起使用的HTTP谓词,用于常见操作和相关的状态代码: HTTP动词增删改查项目(例如:/ resource /

    js_web_api_tester

    2.xx =成功3.xx =重定向4.xx =客户端错误5.xx =服务器错误 200-确定201-创建304-未修改 400-错误的请求401-anuthorsied 403-禁止的404-未找到402-需要的附着物418-我是茶壶 500-内部错误502-网关错误503-服务不可用...

    NetEaseMusicWorldPlus:解锁网易音乐世界

    因云村网页版播放器更改XHR(fetch)实现,发出的选项要求被重定向后返回非2XX状态码导致预检失败,此异常会导致歌曲播放进度记录出现问题(下一首歌不从头开始播放 ),不重置选项请求又会因DNS解析失败而报错,...

Global site tag (gtag.js) - Google Analytics