Apache和mod_proxy不处理HTTP 100 - 从客户端HTTP 417继续

时间:2010-10-08 10:13:43

标签: apache proxy

建立一些webby魔法并使用Apache来支持我们的tomcat服务器,将请求转发到端口8080上的tomcat。我有一个问题,使用Apache和mod_proxy来转发请求。看起来客户端(Web应用程序)发送一个HTTP 100-continue,Apache响应417期望失败。

当我从图片中取出Apache并在端口8080上直接向tomcat发送请求时,请求成功,客户端发送200 OK。

我的Apache配置如下:

    ServerName abcproxy     DocumentRoot / apps / apache-content / default

AddOutputFilterByType DEFLATE text/html text/plain text/css application/javascript text/xml

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html

ExpiresActive on
ExpiresDefault "access 0 seconds"

ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/

        ProxyPreserveHost On

CustomLog /apps/ocp-logs/apache/abcproxy.log combined

任何人都知道我哪里出错了?

2 个答案:

答案 0 :(得分:28)

Apache有一个已知且未解决的Expect标头问题,请参阅bug 46709bug 47087

问题是某些客户端设置了Expect标头,并且只在PUT或POST数据之前发送请求标头。这允许服务器在客户端发送请求主体(PUT或POST数据)之前响应错误/重定向/安全违规。这是一个值得称赞的目标,但显然,客户端不会等到它得到响应并且只是推出请求的主体,这会导致417错误。

如果您可以控制.NET客户端,则可以将ServicePointManager.Expect100Continue Property设置为false,以覆盖此行为。

如果您只能控制服务器,看起来您可以为这些客户端强制使用HTTP 1.0(可能基于用户代理字符串),或者在请求的早期使用mod_header强制取消设置Expect标头。

要使用mod_headers提前删除请求中的Expect标头,请使用以下配置指令:

<IfModule mod_headers.c>
RequestHeader unset Expect early
</IfModule>

这是有效的,因为客户端实际上并没有等待“100 Continue”响应,并且就像没有设置Expect标头一样。

答案 1 :(得分:0)

在我们实际的特殊情况下,它是417的代理应答。 再一次,部署似乎忽略了nonProxyHosts设置。 实际上,我们遇到了以下错误:https://github.com/mojohaus/jaxb2-maven-plugin/issues/60因此jaxb2-maven-plugin破坏了我们的代理设置,并且代理回答了417。

mvn clean deploy

失败。 虽然

mvn deploy

工作。 我发现的最佳解决方法是(请参见上面的链接)是使用另一辆不会被jaxb2-maven-plugin破坏的旅行车(2.4版仍然存在此代理错误):

<extensions>
    <extension>
        <groupId>org.apache.maven.wagon</groupId>
        <artifactId>wagon-http-lightweight</artifactId>
        <version>3.3.2</version>
    </extension>
</extensions>