如果发送的数据超过 1kb,同一服务器上的两个网站之间通过 SSL 进行的 HTTP POST 请求将会失败

如果发送的数据超过 1kb,同一服务器上的两个网站之间通过 SSL 进行的 HTTP POST 请求将会失败

注意:虽然下面有一些 PHP 代码,但我真的相信这本质上属于 ServerFault 而不是 StackOverflow,因为它有效并且在我们更换服务器后它停止工作。

我有以下情况:

  • 有 2 个公共网站,功能不同(更新:两个网站都在同一物理服务器上)。用户可以在网站 A 中填写一份巨大的注册表单,以注册到网站 B。
  • 当用户在网站 A 上注册时,我会向网站 A 中的 PHP 脚本发送 Ajax 请求来验证数据。
  • 这个脚本本质上是一个代理,它将所有数据发送到网站 B,然后 B 会以“OK”或一堆验证错误作为响应。它之所以存在,只是因为我无法直接进行跨域 Ajax。
  • 所有这些都是通过 SSL 进行的 HTTP POST

一切进展顺利,直到我们将位于同一托管公司的服务器迁移到更大的服务器。托管人员负责所有迁移工作,他们的想法是,新服务器的配置与旧服务器相同。

现在,在迁移之后,当提交给代理的信息转换为“HTTP POST 字符串”时,如果超过 1024 个字节,网站 A 到网站 B 的服务器端请求就会默默失败。它运行正常,执行所有代码行,我看不到任何错误、通知或异常。它一直运行到最后,就好像网站 B 用空字符串响应了一样。

但是,如果 POST 小于 1024 字节,一切就都正常,我要么得到正确的验证错误,要么返回“OK”。

直接将完整的 POST 发送到网站 B(无需代理)是可以正常工作的,因此问题是确实在代理呼叫上。

我无法对这种行为做出任何合理的解释,这对我来说完全没有意义。

你们中有人遇到过类似的事情吗?
有什么建议可以告诉我该去哪里找吗?

作为参考,这是代理代码:


$CustomersValidateURL = "https://WebsiteB.com/validatescript";
echo do_post_request($CustomersValidateURL, http_build_query($_POST));

// =========================================================================
function do_post_request($url, $data, $optional_headers = null){

    $params = array('http' => array('method' => 'POST', 'content' => $data));

    if ($optional_headers !== null){
        $params['http']['header'] = $optional_headers;
    }

    $ctx = stream_context_create($params);
    $fp = @fopen($url, 'rb', false, $ctx);

    if (!$fp){
        throw new Exception("Problem with $url, $php_errormsg");
    }

    $response = @stream_get_contents($fp);

    if ($response === false) {
        throw new Exception("Problem reading data from $url, $php_errormsg");
    }

    return $response;
}

这是在同一服务器中从该服务器运行到“网站 B”的跟踪路径的结果:

tracepath customers.xxx.com
 1:  server.xxx.com (208.92.xxx.xxx)      0.144ms pmtu 16436
 1:  server.xxx.com (208.92.xxx.xxx)      0.093ms reached
     Resume: pmtu 16436 hops 1 back 1

答案1

最后,我改用 cURL 重写了脚本。我不知道发生了什么,但 cURL 可以工作。这是我发现的最奇怪的事情之一...

答案2

这似乎是 A 和 B 之间的 MTU 问题,某些东西扰乱了您的路径 MTU 发现。您可以尝试tracepath B从 A 进行类似操作吗?

答案3

我曾经遇到过类似的问题,因为路由器(Windows 2000 的 RRAS,后来在一些 SP 中修复了)没有正确处理 MTU,只是丢弃了太大的数据包,而不是告诉发送者将它们分成更小的碎片。排除故障很麻烦,而且很麻烦,因为那个地方是一家网吧,问题经常出现确切地当客户从某个网络邮件网站发送长消息时。

您应该检查问题是否与 HTTP POST 或任何数据流量有关;一个简单的ping有效负载大于 1024 字节就足以验证这一点。


更新:

好的,看起来这根本不是网络问题。您使用的是什么操作系统和 Web 服务器?

相关内容