我有一个自定义 Java 应用程序的 Apache 代理,该代理在特定错误情况下返回状态代码 460。当此代码到达客户端时,Apache 会错误地将其转换为 500 状态代码,尽管其他代码(404、403)可以正确发送。
这是我的虚拟主机:
<VirtualHost *:80>
ServerName api.acme.org
ProxyPass / http://service.internal:10001/
ProxyPassReverse / http://service.internal:10001/
</VirtualHost>
并且日志条目显示正确的代码:
10.0.0.2 - - [21/Nov/2010:23:20:17 +0000] "GET /session/abc123/touch HTTP/1.1" 460 1379
知道这是什么原因造成的吗?
更新:这是 curl 的标题输出:
直接服务:
# curl -I http://service.internal:10001/session/abc123/touch
HTTP/1.1 460
Content-length: 1388
代理:
# curl -O http://api.acme.org/session/abc123/touch
HTTP/1.1 500 Internal Server Error
Date: Mon, 22 Nov 2010 17:24:51 GMT
Content-length: 1388
Connection: close
Content-Type: text/plain; charset=UTF-8
看来 Apache 对于错误应该是什么有自己的想法!
答案1
该问题可能是 httpd 的一个错误。已在 2.2.18 中修复。
答案2
相反,Apache 似乎返回了正确的错误代码。日志显示 Apache 返回了 460,但您的浏览器可能会以不同的方式解释它(因为 460 未在 RFC 中定义)。有一种简单的方法可以检查这一点;从 Linux 计算机(甚至可能是服务器本身)尝试运行以下命令:
curl -I http://service.internal:10001/session/abc123/touch
如果返回 460,则似乎与浏览器有关(即未知状态代码意味着服务器错误)。如果不是,您可能需要考虑尝试不使用 mod_proxy 来执行此操作——即直接访问 URL。
答案3
mod_proxy 不知道状态 460 是什么意思,也不知道如何反应。
相反,当它看到状态 200 时,它会转发。当它看到 403、404 和其他一些状态时,它就知道该做什么了。