HTTP状态码

Posted

tags:

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

参考技术A

Response中应该包含一个Location URL, 说明资源现在所处的位置,客户端会使用Location中给出的URL,重新发送新的HTTP request 。

浏览器在收到 301 响应之后,从 Location 里面获取到了新的地址,并发起了新的请求。但是,这个新的请求使用的是 GET 方法而非我们原来的 POST 方法,Request Body 也丢失了。

比如某个应用进行了整站重构,重构之后 URL 发生了改变,这时候可以考虑将老 URL 重定向到新 URL。

就好比胡同口有一家我们常去的饭店,但是由于旧城改造这家店搬迁到了另一个地方。有一天我们准备去这家店吃饭,发现门口张贴告示:此店已迁移到 XXX,并附上了详细的新地址。也就是说,之后如果我还想去这家店吃饭,只能去新的地址。

永久重定向
与301的区别就是浏览器不会改变请求的 HTTP Method 和 Request Body

应用场景举例

通常图片资源会放到类似 S3 这样的静态资源服务器,出于对隐私和安全的考虑,我们有时不能直接通过静态资源服务器的 URL 访问到这个图片,而是需要后端通过身份凭证去 S3 签发一个临时地址(这个地址用一次就失效了,下一次需要重新签发),然后我们才能通过这个临时地址访问到真正的图片资源。

对于这个场景,302/303 就非常有用了。比如,前端可以使用一个固定的 URL 来访问图片资源 (<img src="/image/foo.jpg"),这个 URL 由后端提供,后端在生成完临时地址之后,可以直接通过 302/303 重定向到这个新的地址,接下来浏览器会再次发起请求,获取新地址指向的这个图片资源。

临时重定向
与303的区别是浏览器不会改变请求的 HTTP Method 和 Request Body

重定向:返回3**状态码+location响应头;浏览器再次访问location提供的URL。
转发:当次Http请求,直接获取要转发的URL地址并返回。

一般来说文档加载/重新加载都会产生一个 Document 类型的请求

如果是通过 fetch/XMLHttpRequest 调用所获取到的 3XX 响应,浏览器是不会改变当前地址栏的 URL 并跳转的

应用场景

在使用 OAuth2 鉴权时(比如微信登录),可以通过 window.location 重定向到自己服务器的授权地址(支持多个平台登录时,可以由后端统一处理),然后服务器会生成一个三方授权点的地址,并通过 302 响应告知给浏览器,浏览器在收到响应之后会跳转到这个三方授权点的 URL(微信登录页),完成授权之后,三方授权页面会通过 window.location 再重定向回我们自己的页面。

通过 window.location 再配合 302 响应,我们可以快速将用户导向三方授权点,不需要加载任何 JS,非常快速方便。

常见HTTP状态码汇总说明

参考技术A

下面是工作中我们常用的15个 HTTP状态码 ,必须 牢记

如果你想深入了解具体的HTTP状态码,请参考:HTTP状态码超详细说明

这个状态码是告诉客户端应该 继续发送请求 ,这个临时响应是用来通知客户端的,部分的请求服务器已经接受,但是客户端应继续发送求请求的剩余部分,如果请求已经完成,就忽略这个响应,而且服务器会在请求完成后向客户发送一个最终的结果

这个是 最常见 的http状态码,表示服务器已经成功接受请求,并将返回客户端所请求的最终结果。

说白了,就是 一切正常

表示服务器已经接受了请求,但是 还没有处理 ,而且这个请求最终会不会处理还不确定

服务器成功处理了请求,但 没有返回任何实体内容 ,可能会返回新的头部元信息

服务器已经 成功处理了部分GET请求

类似于FlashGet或者迅雷这类的HTTP 下载工具,都是使用此类响应实现断点续传,或者将一个大文档分解为多个下载段同时下载。

客户端请求的网页已经永久移动到新的位置,当链接发生变化时,返回301代码告诉客户端链接的变化,客户端保存新的链接,并向新的链接发出请求,已返回请求结果。

请求的资源现在临时从不同的URI响应请求。由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。

如果客户端发送了一个带条件的GET 请求且该请求已被允许,而文档的内容(自上次访问以来或者根据请求的条件)并没有改变,则服务器应当返回这个304状态码。

简单的表达就是:服务端已经执行了GET,但文件未变化。

关于HTTP缓存内容可参考:一文了解HTTP缓存

Web服务器通过返回HTTP 400错误告诉访问者,访问者用来访问网站的程序出错,或访问请求途中遭到破坏。

访问者试图访问受限页面但未经授权时,网站返回HTTP 401错误。错误登录尝试是导致这一错误的主因。

403错误类似于401错误,不同之处在于401错误是未经授权,而403错误是禁止访问。 任何登录对403错误都不起作用。 尝试访问(被禁止的)网站目录时,就会发生403错误。

请求失败,客户端请求的资源没有找到或者是不存在。

也是比较常见的。

服务器遇到未知的错误,导致无法完成客户端当前的请求。

作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。

服务器由于临时的服务器过载或者是维护,无法解决当前的请求,以上http状态码是服务器经常返回的状态代码,用户只能通过浏览器的状态了解服务器是否正常运行,一般除了错误的状态码,都不会看到服务器的状态码的。

以上是关于HTTP状态码的主要内容,如果未能解决你的问题,请参考以下文章

http状态码分类以及常见状态码分析

HTTP状态码

Http状态码:简单获取http状态码

HTTP状态码404是啥意思?

http协议的状态码 200301304404502 HTTP状态码解释

http协议状态码及其意义