【问题标题】:Apache and mod_proxy not handling HTTP 100-continue from client HTTP 417Apache 和 mod_proxy 不处理 HTTP 100-从客户端 HTTP 417 继续
【发布时间】:2011-04-22 19:40:35
【问题描述】:

正在构建一些 webby 魔术,并使用 Apache 来前置我们的 tomcat 服务器,将请求转发到端口 8080 上的 tomcat。我在使用 Apache 和 mod_proxy 转发请求时遇到问题。似乎客户端(一个 Web 应用程序)发送了一个 HTTP 100-continue,Apache 以 417 Expectation Failed 响应。

当我把Apache出图,直接在8080端口向tomcat发送请求,请求成功,客户端发送200 OK。

我的 Apache 配置如下:

服务器名称 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

有人知道我哪里出错了吗?

【问题讨论】:

    标签: apache proxy


    【解决方案1】:

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

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

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

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

    要使用 mod_headers 尽早从请求中删除 Expect 标头,请使用以下配置指令:

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

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

    【讨论】:

    • 切中要害,您提到的 .NET 客户端很棒,这可以通过将 Expect100Continue 属性设置为 false 来解决。但是我们通过从 Apache 中删除 Expect 标头来解决它
    • 这也可以从 .NET 客户端通过设置 HttpClient.DefaultRequestHeaders.ExpectContinue = false 来完成
    【解决方案2】:

    在我们真正的特殊情况下,代理回答 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>
    

    【讨论】:

      【解决方案3】:

      我在配置 Ivanti 云服务 (ITSM) 时遇到了这个 417 Expectation Failed 错误,它与在前端运行 apache 的 Tufin SecureChange(防火墙规则自动化)的 API 集成。这个补丁解决了我的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多