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

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

我有一个自定义 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 中修复。

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

答案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 和其他一些状态时,它就知道该做什么了。

相关内容