HTTP 常见状态码解析

时间:2024-01-18 12:46:38
  • 1XX 表示消息
  • 2XX 表示成功
  • 3XX 表示重定向
  • 4XX 表示请求错误
  • 5XX 表示服务器端错误

消息:请求已被接受,需要继续处理。由于 HTTP/1.0 协议中没有定义任何 1xx 状态码。

成功:请求已成功被服务器接收、理解、并接受。

重定向:客户端需要采取进一步的操作才能完成请求。后续的请求地址在本次响应的 Location 域中指明。

请求错误:客户端发生了错误,妨碍了服务器的处理/请求有语法错误或请求无法实现。

服务器错误:服务器在处理请求的过程中有错误或者异常状态发生,也有可能是服务器意识到以当前的软硬件资源无法完成对请求的处理。

常见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
    服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

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 内容。