响应中的状态代码重复

pri*_*hor 2 apache tomcat ajp proxypass

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

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

ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
Run Code Online (Sandbox Code Playgroud)

和:

ProxyPass / http://localhost:8080/
ProxyPassReverse / http://localhost:8080/
Run Code Online (Sandbox Code Playgroud)

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

我已经搜索过这个问题,但没有发现任何与之相关的内容,因此我们将非常感谢任何信息。

服务器信息:

  • Apache版本:Apache/2.4.18(Ubuntu)
  • Tomcat版本:apache-tomcat-8.5.13

提前致谢。

小智 5

这不是任何客户端软件的问题,而是 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()));
}
Run Code Online (Sandbox Code Playgroud)

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

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

我建议只要您使用 Tomcat 8.5,就可以通过AJP 连接器sendReasonPhrase中的属性发送原因短语。

HTTP 连接器也存在此属性。;-)