响应中的重复状态代码

Duplicated status code in response

我通常在 Tomcat 服务器中部署 Java 网络应用程序,并使用 proxy_ajp 通过 Apache 代理访问它们。问题是,在我的最新设置中(基本上都是一样的),我发现我在所有请求中获得的状态代码都是重复的(即 "Status Code:200 200")。我在每个浏览器、Postman 以及我可能获得的任何状态代码中都得到了这个,一切似乎都运行良好,但我担心我的设置可能不是最佳的。

虽然我找不到解决方案,但我已将问题缩小到 ajp_proxy,就好像我改变了

ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/

与:

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/

正如预期的那样,我的请求只得到一个状态代码。

我已经搜索过这个问题,但我没有找到任何与之相关的信息,所以非常感谢任何信息。

服务器信息:

提前致谢。

Tomcat 8.5 从响应中删除了 "HTTP status reason phrase",因此您将在响应中得到 HTTP 200 而不是 HTTP 200 OK。您的观察结果可能来自将状态代码复制到状态原因短语中以供显示的软件。

您是如何观察状态码的?您可能会发现,如果您执行协议跟踪,您会发现 Tomcat / httpd.

只发送了一个状态代码

实际上,正如 Christopher Schultz 所指出的,我得到的状态代码既是状态代码又是状态原因文本。

获取 "double" 状态代码只是使用 API 测试工具时可能遇到的一种视觉误导,这些工具通常打印在一起,作为一条信息,包括状态代码和状态原因文本。

这不是任何客户端软件的问题,这是 Tomcat 中针对 2008 年的特定 AJP 问题 中包含的解决方法的结果:Tomcat Issue Tracker #45026

这里可以看到org.apache.coyote.ajp.AjpProcessor (Github)对应的代码片段:

if (sendReasonPhrase) {
    /* ... */
    if (message == null) {
        // mod_jk + httpd 2.x fails with a null status message - bug 45026
        message = Integer.toString(response.getStatus());
    }
    tmpMB.setString(message);
} else {
    // Reason phrase is optional but mod_jk + httpd 2.x fails with a null
    // reason phrase - bug 45026
    tmpMB.setString(Integer.toString(response.getStatus()));
}

最后这意味着,每个基于 AJP 的响应都将始终 传递一个 HTTP 状态原因短语 - 至少将状态编号作为内容。

这准确解释了在您的两个 ProxyPass 场景中观察到的行为。

我建议只要您保持在 Tomcat 8.5,就可以通过 AJP Connector 中的 sendReasonPhrase 属性发送原因短语。

此属性也存在于 HTTP Connector。 ;-)