【问题标题】:Why our server receives CONNECT method requests from our android app while we don't use it in our code?为什么我们的服务器从我们的 android 应用程序接收 CONNECT 方法请求,而我们没有在代码中使用它?
【发布时间】:2015-06-03 15:13:40
【问题描述】:

一些用户抱怨网络问题。 我们的 android 应用通过 https 与我们的服务器通信。

我们的 Apache 日志显示了带有状态的响应; “405 Method not allowed (CONNECT)”,此问题仅在特定 IP 地址上重现。

我不明白为什么 android 应用程序尝试使用 CONNECT 方法访问服务器,我从不在应用程序中使用此方法,我只使用 GET、POST 或 PUT。

似乎代理可能涉及该问题,但我不知道如何解决它。有谁知道吗?

【问题讨论】:

  • 也许你被黑了:P
  • 我不使用IIS,我提到了Apache,版本是2.4
  • 如何确定这些请求是从您的 Android 应用发出的?
  • 有多少用户抱怨这个网络问题? IP 地址是否由同一个 ISP 提供?您使用的是 Volley 网络库(由 Google 提供)还是标准的 Android API 网络调用或某种自定义网络库?您完全确定网络错误来自您的 Android 应用吗?

标签: android http https http-status-code-405


【解决方案1】:

查看 wiki 中的 http 连接

HTTP 代理服务器后面的 HTTP 隧道变体是 使用“CONNECT”HTTP 方法。[1][2]

不是指出显而易见的,而是在 Apache 接缝中启用 connect 方法,就像答案一样。比要求客户删除他们的代理服务器更容易。

【讨论】:

    【解决方案2】:

    您需要为 CONNECT HTTP 方法提供支持,该方法通常用于通过代理服务器对 SSL 请求进行隧道传输。这就是你收到它们的原因,有些用户在代理后面。

    在 Apache 中,要启用处理 CONNECT 请求,mod_proxymod_proxy_connect 必须存在于服务器中。

    问题是你需要secure your server,这可能会破坏你的应用程序的目的。

    如果您没有保护您的服务器,请不要启用 mod_proxy 和 mod_proxy_connect。

    【讨论】:

    • 我知道这个选项,但服务器团队告诉我他们不想启用 mod_proxy,因为未知的副作用。
    • 很遗憾,因为没有它,Apache 将无法处理 CONNECT 请求。您应该考虑使用 http 而不是 https 来阻止 CONNECT 请求并自己加密数据或更改为允许您启用所需内容的托管服务提供商。
    • 但这不是问题的解决方案!如果一段代码旨在处理针对服务器的 GET 和 POST 方法。如果日志显示某些特定 IP 使用 CONNECT 方法,则用户端或网络架构(防火墙/反向代理)存在问题。启用 apache 模块来处理特定的用例/故障不是一个合适的解决方案。
    • @Matt 这不是用户方面的问题。这是代理服务器代表其背后的客户端发送请求的标准网络实践。
    • 他没有运行https代理,你为什么需要他把他的Apache变成代理服务器? CONNECT 方法需要为 https 代理服务器启用,而不是为最终目标服务器(网站服务器)启用。 1) client ----connect---->proxy-----tcp connection--->server , 2) client <--------->proxy<-------->server 检查 this source 了解 https 代理服务器的工作原理
    【解决方案3】:

    我无法提供一揽子解决方案,因为这里的一半战斗在于您支持的 Android 应用程序的源代码树,以及与您雇主的基础架构政策相关的变量组合。作为 Apache 管理员,您需要回答三个大问题,并且从概念上讲,您应该为每个问题回答这个问题:

    1. “问题”客户端最后一次能够正常连接是什么时候?
    2. 从那时到现在发生了什么变化,什么时候发生了变化?
    3. CONNECT 消息是否与客户端报告错误 1:1 相关?

    问题一和二是优先事项,但不应在这样的公共论坛上深入讨论。对您的公共或私有配置、应用程序等所做的更改通常被视为您雇主的知识产权。如果您在这里或任何地方讨论这个问题,请谨慎行事。 如果您发现进行了更改,甚至是“无害”的更改,请发现它们与客户问题的相关性并在适用的情况下实施回归测试。

    我将讨论第三个问题。根据我在上面阅读的消息,尚未确认 CONNECT 与每个客户问题相关。似乎有些客户报告了问题,而您查看了日志以了解问题的症状。 CONNECT 错误看起来像一个问题,根据您分享的一些 Android 应用规范,它们可能是问题所在。但是,它们也可能是有人扫描您的服务器以查找易受攻击的模块而产生的“日志噪音”。

    如果您尚未证明 CONNECT 与客户错误的相关性,请尝试使用 <If> 指令并记录有关发出 CONNECT 语句的客户端的其他数据。作为一个通用示例:

    <If "%{REQUEST_METHOD} == CONNECT">
        ... some extra log format fields to get ALL of the data ...
        ... maybe a special log file just for CONNECTers?
    </If>
    

    使用收集到的数据来了解趋势。可能只有特定版本的 Android 与您的应用程序才会以这种方式运行。您可以分支 &lt;If&gt; 来更改这些用户接收内容的方式,或者您可以与您的 Android 应用程序的开发人员合作(当前的应用程序,或者您雇用的下一个应用程序;))基于应用程序本身的 Web 服务器要求列表。

    更好的是,结构良好的块可以让您捕获特定客户端的调试数据,而不会中断那些应用正常工作的客户端。与往常一样,我建议先在实验室进行构建和测试;永远不要将全新的想法部署到生产环境中,并且绝对不要启用模块,因为 Internet 告诉您这样做,即使他们对模块的命名是正确的。

    这里是 Apache 的 &lt;If&gt; 指令文档的链接:

    http://httpd.apache.org/docs/2.4/mod/core.html#if
    http://httpd.apache.org/docs/2.4/expr.html

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2021-05-13
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2017-07-21
      • 2010-12-26
      • 2019-11-28
      相关资源
      最近更新 更多