`
no7beckham
  • 浏览: 97629 次
  • 性别: 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 很重要:)
分享到:
评论

相关推荐

    postman响应状态码

    ### Postman响应状态码详解 ...2xx系列状态码表示成功,3xx系列状态码表示重定向,4xx系列状态码表示客户端错误,5xx系列状态码表示服务器错误。掌握这些状态码对于前端开发、后端开发、测试和运维工作都非常重要。

    HTTP状态码详细分解

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

    易语言取HTTP状态码

    HTTP状态码是服务器对客户端请求的响应,通常由三位数字组成,分为五类:1XX(信息响应)、2XX(成功)、3XX(重定向)、4XX(客户端错误)和5XX(服务器错误)。例如,200表示请求成功,404表示找不到资源,500表示...

    标准http问题状态码

    3xx(Redirection 3xx)状态码指示客户端需要采取进一步操作才能完成请求。例如,300 Multiple Choices表示有多个可用资源,响应体可能包含可供选择的列表,用户代理可以根据Location字段的URL进行重定向。301 Moved...

    常见的http状态码

    这些状态码分为五大类:1xx(信息性状态码)、2xx(成功状态码)、3xx(重定向状态码)、4xx(客户端错误状态码)以及5xx(服务器错误状态码)。 #### 三、具体状态码详解 ##### 1xx(信息性状态码) 这类状态码...

    HTTP 状态码 大全

    3xx状态码表示需要客户端采取进一步的操作才能完成请求。通常,这些状态码用来重定向。 - **300 多种选择**:请求的资源对应多个位置。用户/用户代理必须选择一个并重复请求。 - **301 永久移动**:请求的资源已被...

    HTTP状态码详解

    5XX状态码则意味着服务器存在问题,可能需要排查服务器配置、代码错误或是资源不足等问题。通过合理的错误处理机制,如返回友好的错误信息,可以提升用户体验。 综上,理解并掌握HTTP状态码对于任何涉及Web开发的...

    http状态码汇总http网络

    3. 3XX(重定向):这些状态码表示需要进一步操作才能完成请求,通常是因为请求的目标资源已经被移动。 - 301(永久移动):请求的资源已被永久移动到新的URL。 - 302(临时移动):资源临时从不同的URL响应请求。...

    HTTP响应状态码

    3. 3XX(重定向):这些状态码表示客户端必须采取进一步操作才能完成请求。比如301(永久移动)表示资源已永久移动到新的URL;302(暂时移动)是临时重定向;304(未修改)表示资源自上次请求后未发生变化,客户端可...

    取HTTP状态码.rar

    1. 1xx(临时响应):表示临时响应并需要请求者继续执行操作的状态码,如100(继续)。 2. 2xx(成功):表示成功处理了请求的状态码,如200(成功),表明请求已被正常处理。 3. 3xx(重定向):表示要完成请求,...

    HTTP 状态码

    HTTP协议定义了多种状态码,每个状态码都是三位数字,分为五类:信息响应(1XX),成功响应(2XX),重定向(3XX),客户端错误(4XX)和服务器错误(5XX)。这些状态码提供了关于请求是否被成功处理的信息。 1. ...

    HTTP状态码完整列表

    3xx(重定向):当请求需要进一步操作才能完成时,服务器会返回这些状态码。比如301(永久移动)用于告诉客户端请求的网页已永久转移到新地址,搜索引擎优化时会用到这个状态码来更新索引。302(临时移动)是临时...

    常见HTTP状态码(200、301、302、500等)解说

    在HTTP/1.0协议中未定义任何1XX状态码,而HTTP/1.1协议中定义了几种1XX状态码,但通常情况下,服务器不会向常规客户端发送这些状态码。 2XX系列的状态码代表请求已被成功接收、理解并接受。其中,200状态码表示...

    http状态码批量查询工具.zip

    - 检查重定向:3xx状态码意味着重定向,应确保重定向正确无误,避免链路损失。 - 确保服务器稳定性:5xx状态码表明服务器端存在问题,需要排查和解决,以保证网站的正常运行。 这个"http状态码批量查询工具.exe"是...

    HTTP状态码.pdf

    这类状态码表示临时响应,用于通知客户端其后续操作,但在HTTP/1.0中未定义任何1xx状态码,因此它们不作为对HTTP/1.0请求的合法响应。在HTTP/1.1中,此类状态码主要用于服务器推送信息,如`100 Continue`指示客户端...

    HTTP状态码表示意思

    3xx(已重定向):这些状态码表示客户端需要采取额外的步骤来完成请求。301(永久移动)表示请求的资源已被永久移动到新的URL,浏览器和搜索引擎会更新缓存的URL;302(临时移动)与301类似,但资源只是临时移动;...

    如何选择正确的HTTP状态码

    3. 3xx(重定向状态码):需要后续操作才能完成这个请求。 4. 4xx(客户端错误状态码):请求包含语法错误或无法完成请求。 5. 5xx(服务器错误状态码):服务器在处理请求的过程中发生了错误。 具体到不同的场景,...

    http状态码详解.docx

    3. **3XX** - 重定向状态码:指示请求资源已被临时或永久移动到另一个位置,通常伴随着一个新的资源位置。 - **301 Moved Permanently**:请求的资源已被永久移动到新位置。 - **302 Found (Temporary Redirect)...

    网络开发者必备->http状态码大全

    3xx(已重定向)状态码表示客户端需要采取进一步操作才能完成请求。301(永久移动)和302(临时移动)用于页面迁移,301是永久性重定向,搜索引擎会更新索引,而302则是临时重定向,搜索引擎仍会抓取原始URL。303...

    HTTP服务器状态码定义.doc

    HTTP/1.0中未定义1xx状态码。 1.2 成功状态码(2xx): 表示客户端的请求已经被成功处理。 - 200 OK:请求成功,资源已随响应返回。 - 201 Created:请求完成后创建了新资源,新的资源URI可在响应中获取。POST请求...

Global site tag (gtag.js) - Google Analytics