HTTP 常见状态码解析

2018/05/23 18:07
阅读数 15

概述

  • 1xx:指示信息--表示请求已接收,继续处理

  • 2xx:成功--表示请求已被成功接收、理解、接受

  • 3xx:重定向--要完成请求必须进行更进一步的操作

  • 4xx:客户端错误--请求有语法错误或请求无法实现

  • 5xx:服务器端错误--服务器未能实现合法的请求

常见HTTP状态码

  • 200 OK 表示请求成功 一切正常

  • 301 Moved Permanently 重定向,客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL

  • 302 Found 临时重定向,类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。

  • 304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求。服务器告诉客户,原来缓冲的文档还可以继续使用。

  • 307 Temporary Redirect 临时重定向,与302类似,只是强制要求使用POST方法。

  • 400 Bad Request 请求出现语法错误。

  • 401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填 写合适的Authorization头后再次发出请求。

  • 403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致

  • 404 Not Found 无法找到指定位置的资源。

  • 405 Method Not Allowed 请求方法(GET、POST、HEAD、Delete、PUT、TRACE等)对指定的资源不适用。

  • 500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。

  • 501 Not Implemented 服务器不支持实现请求所需要的功能。

  • 502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

3xx 状态码详解

301 状态码(Moved Permanently) 301状态码在HTTP1.0和HTTP1.1规范中均代表永久重定向,对于post请求的重定向,还是需要用户确认之后才能重定向,并且应该以post方法发出重定向请求。 关于post请求重定向用户确认的问题,实际上浏览器都没有实现;而且post请求的重定向应该发起post请求,这里浏览器也并不一定遵守,所以说HTTP规范的实现并未严格按照HTTP规范的语义。

302 状态码(Moved Temporatily) 在http 1.0规范中,302表示临时重定向。出现该状态代码时,浏览器能够自动访问新的URL。 规范:原请求是get,可以自动重定向;原请求是post,则不能自动进行重定向。 实现:浏览器和服务器的实现并没有严格遵守HTTP中302的规范,浏览器即便原请求是post也会自动重定向,导致规范和实现出现了二义性,由此衍生了一些问题,譬如302劫持,因此在HTTP 1.1中将302的规范细化成了303和307,希望以此来消除二义性。

补充:302劫持——A站通过重定向到B站的资源xxoo,A站实际上什么都没做但是有一个比较友好的域名,web资源xxoo存在B站并由B站提供,但是B站的域名不那么友好,因此对搜索引擎而言,可能会保存A站的地址对应xxoo资源而不是B站,这就意味着B站出了资源版权、带宽、服务器的钱,但是用户通过搜索引擎搜索xxoo资源的时候出来的是A站,A站什么都没做却被索搜引擎广而告之用户,B站做了一切却不被用户知道,价值被A站窃取了。

303 状态码(See Other) 继承了HTTP 1.0中302的实现:无论原请求是get还是post,都可以自动进行重定向 303响应应该禁止被缓存。重定向的相应可能被缓存。

307 状态码 继承了HTTP 1.0中302的规范:原请求是GET 或 HEAD,则浏览器可以自动重定向;原请求是 POST,则不能自动进行重定向。

302、303、307 状态码辨析 在HTTP 1.1中,302是不再推荐使用的,只是为了兼容而作保留。为了细化HTTP1.0中302的语义,HTTP1.1引入了 303 和 307,主要用在对非 GET、HEAD 方法的响应上,而对于 GET 和 HEAD 的请求,可以自动重定向。

在 GET、HEAD 这些幂等的请求方式上,302、303、307 没啥区别,而对于 POST 就不同了,大部分浏览器的302 会将 POST 请求转为 GET,而 303 规范强制将 POST 转为 GET 请求,请求地址为 header 头中的 Location,307 则不一样,规范要求浏览器继续向 Location 的地址 POST 内容。

:memo: 303 和 307 的存在,归根结底是由于 POST 方法的非幂等属性引起的。

参考

HTTP状态码 HTTP状态码 HTTP状态码详解 http重定向301/302/303/307

img

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部