回复

时间:2017-05-24 08:17:50

标签: apache tomcat proxypass ajp

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

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

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

使用:

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

正如预期的那样,我只为我的requets获得了一个状态代码。

我已经搜索过这个问题,而且我没有发现任何与它有轻微关系的内容,所以任何信息都会非常感激。

服务器信息:

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

提前致谢。

3 个答案:

答案 0 :(得分:2)

这不是任何客户端软件的问题,这是由于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也存在此属性。 ;-)

答案 1 :(得分:1)

实际上,正如Christopher Schultz指出的那样,我将状态代码作为状态代码和状态原因文本。

获取“双重”状态代码只是在使用API​​测试工具时会遇到的视觉误导,这些工具通常可以作为单个信息一起打印在一起,包括状态代码和状态原因文本。

答案 2 :(得分:0)

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

您如何观察状态代码?您可能会发现,如果执行协议跟踪,您将看到Tomcat / httpd只发送一个状态代码。