TL;DR
- 505错误意味着“HTTP版本不受支持” — 服务器拒绝了请求行中声明的HTTP版本,这通常与您试图加载的特定页面无关。
- 记录的技术原因包括请求行格式错误、请求行以错误的行结束符终止,或中间(代理或负载均衡器)在请求到达源服务器之前错误处理转发的请求。
- 作为访问者,更新或切换浏览器并清除其缓存可以解决大多数客户端505错误,因为过时的客户端可能会发送现代服务器不再接受的版本。
- 作为服务器管理员,修复通常在您的反向代理或web服务器配置中 — nginx的
proxy_http_version指令和Apache的force-proxy-request-1.0设置都控制哪个HTTP版本到达您的后端。 - 作为客户端和源服务器之间的代理或负载均衡器是505错误的记录原因,因此在修改应用程序代码之前排除该层可以节省调试时间。
- 505是不同于502、503或504网关错误以及426需要升级响应的另一种失败,尽管所有这些错误均源于服务器端。
HTTP 505错误的含义
HTTP 505响应意味着服务器拒绝处理请求,因为它不支持请求声明的HTTP版本。与大多数浏览器或HTTP代理可以显示的状态代码相比,这是一种更狭窄的失败,因为它涉及协议封装本身,而不是身份验证、速率限制或请求的资源。根据MDN HTTP状态码参考,“HTTP 505 HTTP版本不受支持服务器错误响应状态代码表示请求中使用的HTTP版本不受服务器支持。”这种框架很重要:505是关于请求协议封装的声明,而不是关于URL、页面内容或(通常)您的账户或权限。看到505并不意味着网站像404或500那样宕机——这意味着在客户端和服务器之间的某个路径中发送了一个服务器无法解析为其可识别版本的请求。
为什么服务器实际返回505?
三种技术情况会产生此响应,MDN直接记录了这三种情况。一条格式错误的请求行——例如,一个原始的、未编码的空格应该是一个URL中的%20——可能会混淆服务器解析后面的HTTP版本标记的方式。一条以裸\n而不是所需的\r\n终止的请求行可以产生同样的效果,因为服务器的解析器在读取版本之前正在寻找特定的行结束符。第三种原因是最常被忽视的:中间件,例如负载均衡器或代理,未能正确转发其传递的请求行中的版本信息,这会导致源服务器读取一个实际上从未是客户端发送的版本。
值得优先排除的常见原因
在实际操作中,一些日常情况造成了大多数网站访问者和开发人员报告的505错误。一个过时的浏览器或HTTP客户端库仍然以遗留格式发出请求是更常见的触发因素之一,尤其是在那些多年未更新的自动化脚本或较旧的SDK中。配置错误的web服务器——一种完全拒绝HTTP/1.0或指向错误协议处理程序的虚拟主机的服务器——是另一个原因。过时的服务器软件在广泛支持HTTP/1.1或HTTP/2之前发布的也能产生此错误。第四个,也是本指南花费最多时间探讨的,是在传输过程中修改HTTP版本的代理或中介,这与MDN列出的第三个原因完全一致。
快速了解
如果在通过旋转代理池运行请求时遇到不一致的505错误,代理本身可能就是搞砸您的请求行的原因 — Nstproxy的网关使用标准HTTP(S)和SOCKS5,而不是自定义协议实现,因此它不是您需要调试的变量。




