将介绍400、500系列表示错误的响应码,搞清楚这些错误响应码的含义对于我们快速地定位问题非常有帮助。
- 4xx:客户端出现错误
- 400 Bad Request:服务器认为客户端出现了错误,但不能明确判断为以下哪种错误时使用此错误码。例如HTTP请求格式错误。
- 401 Unauthorized:用户认证信息缺失或者不正确,导致服务器无法处理请求。(比如URI如果需要传递user和password的时候,往往会得到401Unauthorized)
- 407 Proxy Authentication Required:(对401的补充,401往往是源服务器返回的用户信息验证不通过,如果代理服务器会首先验证用户的认证信息的话,那么代理服务器没有通过就会返回407。比如将常在机场、网吧等场合下,如果我们信息验证没通过,可能就会收到407)对需要经由代理的请求,认证信息未通过代理服务器的验证
- 403 Forbidden:服务器理解请求的含义,但没有权限执行此请求(常见于搭建了一个服务器,但是我对于某个目录下的文件访问可能没有权限,这个时候客户端就会收到403 Forbidden)
- 404 Not Found:服务器没有找到对应的资源(对应的资源已经丢失的)
- 410 Gone:(对404 Not Found的一个补充,404只是说服务器找不到对应的资源,但是不知道过一会是不是就能再次找到)服务器没有找到对应的资源,且明确的知道该位置永久性找不到该资源。(很少使用到,实际情况中比较难以遇到)
- 405 Method Not Allowed:服务器不支持请求行中的method方法(比如trace方法在nginx 0.5版本中已经明确的不支持了,现在访问任何一个这样的服务器使用trace方法都会得到405 method not allowed)
- 406 Not Acceptable:对客户端指定的资源表述不存在(例如对语言或者编码有要求),服务器返回表述列表共客户端选择。
- 408 Request Timeout:服务器接收请求超时(比如说服务器接收一个请求最长只能用一分钟,但是一分钟还没有发完我们的请求,就用可能发声这样的事情)
- 409 Conflict:(post或者put上传一个文件,但是目标位置已经存在了版本更新的一个资源,我们这个资源没有办法去覆盖它,这时候就会拿到409 Conflict)资源冲突,例如上传文件时目标位置已经存在版本更新的资源
- 411 Length Required:如果请求含有包体且未携带Content-Length头部,且不属于chunk类请求,返回411(非常容易构造,加入包体但是又不加入conten-length,也不加入chunk类的相关的描述)
- 412 Precondition Failed:(条件类请求不满足的时候,就会返回412)复用缓存时传递的If-Unmodified-Since或者If-None-Match头部不被满足
- 413 PayloadTooLarge/Request Entity Too Large:请求的包体在超出服务器能处理的最大长度(wordpress默认长传的附件可能只有2M,就是wordpress的插件,通常需要去把默认的2M向上去调整,就不再得到413这样的错误了。)
- 414 URI Too Long:请求的URI超出服务器能接受的最大长度(如果是比较老的服务器,那么对URI通常限制是4k,像nginx这样的比较新的版本服务器,通常限制可能达到了32k。所以我们去验证也是很容易的,我们发一个巨大的URI,超出了服务器能处理的最大长度,我们就会得到414)
- 415 Unsupported Media Type:(上传的请求包体对应的文件类型,就是mime类型,是不被服务器所支持的,比如说我们搭建了一个wordpress的站点,它就通常默认是拒绝exe这样的可执行文件,直接出传递,防止有安全的风险。这个时候客户端就会收到415这样的一个错误码,我们就知道只因为服务器认为这个文件类型暂时不被支持)上传的文件类型不被服务器支持。
- 416 Range Not Satisfiable:(对于多线程断点续传下载,指定中一段包体是不支持的,比如我们指定从1G到2G这段,但实际上这个文件可能只有100M)无法提供Range请求中指定的那段包体
- 417 Expectation Failed:(比如客户端发送中包括Expect 100,我要上传一个巨大的文件了,我期待你给我一个100,但是如果说服务器不支持的情况下,没有办法满足这个要求,它就会返回417)对于Expect请求头部期待的情况无法满足时的响应码
- 421 Misdirected Request:服务器认为这个请求不该发给它,因为它没有能力处理。(很少能在网络中见到)
- 426 Upgrade Required:服务器拒绝基于当前HTTP协议(比如说HTTP 1.1,要求客户端必须基于更新的,比如说websocket,或者是HTTP2.0,我才提供服务,这个时候就会返回426)提供服务,通过Upgrade头部告知客户端必须升级协议才能继续处理。
- 428 Precondition Required:用户请求中缺失了条件类头部,例如If-Match(跟条件请求相关)
- 429 Too Many Request:客户端发送请求的速率过快(很多服务器限流限速的时候,往往不会给客户端发429,虽然RFC规范中429是更明确的告诉客户端这样一件事情,但是往往我们会发送503,在5系列响应码中再详细介绍)
- 431 Request Header Fields Too Large:请求的HEADER头部大小超过限制(可以看出这里的规范定义的实在是太细了,因为我们刚刚去限制了URI如果特别大的时候,返回了一个414的这样的响应码,431又对于Header去做了一个限制,实际上很多服务器是不会去做这么严格的错误码的返回的,通常都只会返回这个414 URI Too Long,因为URI和Request Too Long往往在服务器中作为同一段缓存区去存储处理的)
- 451 Unavaiable For Legal Reasons:RFC7725,由于法律原因资源不可访问
- 5xx:服务器端出现错误
- 500 Internal Server Error:(这可能是我们最常见的一种错误,就是这个内部错误已经没有办法细分了)服务器内部错误,且不属于一下错误类型
- 501 Not Implemented:服务器不支持实现请求所需要的功能(当前请求执行的功能我们现在还没有去实现,需要服务器端去升级或者说添加相应的功能)
- 502 Bad Gateway:(非常常见的错误码,在与服务器之间有代理服务器,但是这个代理服务器连接不上源服务器,或者说代理服务器没有办法从我们的源服务器中获取到合法的一个响应,这是502 Bad Gateway)代理服务器无法获取到合法响应
- 503 Service Unavailable:服务器资源尚未准备好处理当前请求(实际上会有很多种原因导致503出现,比如服务器端做请求的限速,或者说去对于用户的ip做并发连接的限制,那么当达到上限的时候呢,都有可能去发送503,表示我们服务器的资源还没有准备好处理当前请求)
- 504 Gateway Timeout:代理服务器无法及时的从上游获得响应(代理服务器与我们的源服务器之间出现了超时,比如我们现在上传一个巨大的文件,或者下载一个巨大的文件,但是我们的代理服务器,例如nginx,它配置的超时时间是1分钟,那如果1分钟之内源服务器还没有及时的响应它,那么代理服务器就会给客户端发送一个504 Gateway Timeout。所以看到我们应该立即反应出来,是代理服务器上的超时时间设置的可能过小)
- 505 HTTP Version Not Supported:请求使用的HTTP协议版本不支持(比如说有一些服务器不支持HTTP 2.0,但是我们构造了一个2.0的请求,就会得到这样的响应。我们去验证它也非常的容易,比如GET / HTTP/2.0。)
- 507 Insufficient Storage:服务器没有足够的空间处理请求(通常是指磁盘空间,所以507这个错误码已经把服务器内部的相关的问题暴露给客户端了,所以通常507是不被我们见到的,因为这里会有安全性的问题)
- 508 Loop Detected:访问资源时检测到循环(或者说循环已经超过了最大的限制次数了,就会返回508 Loop Detected)
- 511 Network Authentication Required:代理服务器发现客户端需要进行身份验证才能获得网络访问权限(也是同样在机场、网吧等这样的场景我们经常会见到)
小结
这篇文章介绍了客户端出现错误时的400系列错误响应码,以及服务端出现错误时的500系列错误响应吗,那么与上篇文章中介绍的100、200、300系列响应码中,它们还遵循一个潜在的规则,就是当客户端接收到了,一个它不认识的响应码,不知道如何处理的时候,将按照它们所在系列的第一个,就是00系列那个响应码逻辑进行去处理,比如说我们现在收到了一个555这样的响应码,客户端不认,就会按照500的处理逻辑。如果收到了一个277,那么也会按照200这个错误码的处理逻辑来处理。
参考
陶辉老师的Web协议详解与抓包实战课程