Apache将响应代码460更改为500 – 为什么?

我有一个Apache代理到一个自定义的Java应用程序,在特定的错误条件下返回状态代码460。 当到达客户端时,apache不正确地把它变成500状态码,尽pipe其他的(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有自己的想法应该是什么错误!

这个问题可能是httpd中的一个错误。 在2.2.18中修复。

https://bugzilla.redhat.com/show_bug.cgi?id=900827

相反,Apache IS似乎返回了正确的错误代码。 日志显示Apache返回460,但是你的浏览器可能会以不同的方式解释(因为460在RFC中没有定义)。 有一个简单的方法来检查这个; 从Linux机器(甚至可能是服务器本身),请尝试运行以下命令:

 curl -I http://service.internal:10001/session/abc123/touch 

如果这返回460,那么看起来与浏览器有关(即,未知的状态码意味着服务器错误)。 如果没有,你可能要考虑尝试这个没有使用mod_proxy – 即通过直接访问URL。

mod_proxy不知道460是什么意思,也不知道如何反应。

相反,当它看到状态200时,它转发。 当看到403,404和其他的时候,它知道该怎么做。