Learn HTTP 1.1 Status Code Part.5
by xujiwei(http://www.xujiwei.com/)
前一篇介绍了 4xx 系列状态码 中 406 到 417,这篇接着讲剩下的 5xx 系列。
7. 5xx 系列内部服务器错误
在 服务器处理请求时出问题了,服务器可以发一个 5xx 系列错误码给客户端,表示服务器在处理请求的时候出问题了,问题是出在服务器身上而不是客户端身 上。另外,服务器如果发送了 5xx 系列的状态码,除非客户端是使用的 HEAD 方法,否则服务器还应该在响应中给出错误的描述、原因以及解决方法 等,客户端可以把这些东西给用户看,让用户知道是什么原因导致了请求出错。
不过通常情况下,用户在收到 5xx 系列错误码的同时,是不会 收到导致错误的详细技术信息的,这是为了保护服务端程序安全的需要。服务器一般会返回一个页面描述所出的错误是由什么原因引起的,而不涉及详细技术信息。 例如在 ASP.NET 中,可以在 web.config 中的 customErrors 节配置自定义错误的显示方式,有 On、Off、 RemoteOnly 三种方式,可以根据具体的需要来设置,像 RemoteOnly 就会给本地开发者显示详细的错误信息以及调试信息,而对远程访问 者则会只显示服务器运行时出现错误,没有详细的调试信息。
7.1. 500 Inernal Server Error
500 Internal Server Error 表 示内部服务器错误,这个对于一般用户来说是比较常见的,许多 IIS 服务器都会配置成不发送详细错误信息,而 IIS 的默认设置就是在服务器发生内部 错误时发送 Internal Server Error 这个字符串代替具体的错误信息。
对于 ASP 程序来说,如果是使 用 VBScript 作为脚本语言,那么可以在代码的最前面加一句 On Error Resume Next 来忽略错误继续运行程序,或者加一个错 误处理子程序,或者直接停止脚本的运行,以防止关键信息的泄露。
7.2. 501 Not Implemented
501 未 实现表示服务器对于客户端请求的方法没有实现,从而不能满足客户端的请求。这个错误比较少见,我目前还没有见过这个错误,或者在使用一个开发中 的 Web 服务器时会出现这个错误,例如使用 PUT 方法发送请求但是服务器不支持 PUT 方法,那么服务器就可以发 送 501 Not Implemented 错误码。
7.3. 502 Bad Gateway
当 服务器是作为一个网关或者代理时,在处理客户端请求时从上游服务器收到了一个无效的响应,这时服务器可以返回一个 502 Bad Gateway。
出 现这种情况可能的原因有网关或代理过滤了所请求的网址,或者真正的服务器挂掉了,这些时候代理或网关都可以发送 502 Bad Gateway。
那 么,502 Bad Gateway 是用来表示代理或网关在处理请求时发生了错误,并不一定是原始服务器出现了问题。
7.4. 503 Service Unavailable
503 服 务不可用,表示服务器当前负载过大或者正在维护,这通常表示这是一个临时的情况,服务器会在一定的时间之后恢复正常。如果时间已知,例如服务器在维护,那 么服务器在发送 503 Service Unavailable 的同时,可以在响应头部添加一个 Retry-After 字段表示维护会持续多久, 在指定的时间之后,客户端就可以尝试再次发送请求了。
如果是使用虚拟主机,那么在网站负载过大的时候,一般都会出 现 503 Service Unavailable,因为提供商会限制 CPU 使用率 :)
不过 503 并不一定表示服务器负载过大 或者正在维护,也可能是服务器只是想拒绝处理请求而已。那么,我们也可以在处理 IP 屏蔽之类的情况时直接来一 个 503 Service Unavailable :)
7.5. 504 Gateway Timeout
与 502 Bad Gateway 类 似,这个状态码一般是代理或网关服务器返回的,出现这个状态码意味着代理服务器在处理请求时超过了超时时间仍个没有从原始服务器接收到响应内容,也有可能 是因为在解析原始服务器的域名时超时了。
7.6. 505 HTTP Version Not Supported
客 户端使用 HTTP 版本不被服务器支持,或者服务器拒绝支持客户端所使用的 HTTP 版本,使用向一个只支持 HTTP 1.0 的服务器发送了一个 使用 HTTP 1.1 的请求,那么服务器可以响应 505 HTTP Version Not Supported。在 RFC 指出服务器如果发送 了 505 HTTP Version Not Supported 状态码,那么同时也应该在响应中指出为什么客户端所用的 HTTP 版本不被支持以 及服务器支持哪些协议的哪些版本。
后记
这是本系列的最后一篇了,发现大部分东西都是直接 翻译了 RFC 中的内容,不过也算是把所有的 HTTP 状态码学习了一遍,对于 AJAXRequest 的开发也有了点想法,但是发 现 jQuery 中对 HTTP 状态的处理还算全面,突然觉得 AJAXRequest 有些简陋了。嗯,不过 AJAXRequest 也是我学习 的一个过程,敝帚自珍,哈~
参考资料
系 列目录
0 条评论。