HTTP/1.1 400 Bad Request between an AWS server to another AWS server but HTTP/1.1 200 between my local server and the same AWS server

HTTP/1.1 400 Bad Request between an AWS server to another AWS server but HTTP/1.1 200 between my local server and the same AWS server

参考

PHP App1 AWS 实例

AWSApp1Live(64 位亚马逊 Linux 2015.03 v1.4.6 运行 PHP 5.5)

AWSApp1Test(64 位亚马逊 Linux 2015.03 v1.3.2 运行 PHP 5.6)

PHP App2 AWS 实例

AWSApp2Live(64 位亚马逊 Linux 2016.09 v2.3.2 运行 PHP 5.6)

AWSApp2Test(64 位亚马逊 Linux 2015.09 v2.0.4 运行 PHP 5.5)

本地 App1 实例

LocalApp1 (Windows 10 运行 XAMPP 控制面板 v3.2.1)


概览

我有两个 PHP 应用程序:PHP App1 和 PHP App2,它们通过使用内部 POST 请求相互通信来协同工作。 PHP App1 使用

发送请求
$query = http_build_query($data);
$context = stream_context_create(array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-Type: application/x-www-form-urlencoded' . PHP_EOL .
        'Cv-Forwarded-For: ' . $_SERVER["REMOTE_ADDR"] . PHP_EOL,
        'content' => $query,
    ),
    'ssl'=>array(
        'verify_peer'=>false,
        'verify_peer_name'=>false
    )
));

$response = @file_get_contents(
    $target = $this->api_target.$action,
    $use_include_path = false,
    $context
);

PHP App2 是 运行 一个 RESTful API 服务,它响应从 PHP App1 发送的请求。响应是 JSON 字符串。


问题

如上所述,我已将这些 PHP 应用程序加载到四个不同的 AWS 实例上。 request/respone

的以下组合

AWSApp1LiveAWSApp2Live

通信
(HTTP/1.1 400 Bad Request)

AWSApp1TestAWSApp2Live 通信

(HTTP/1.1 400 Bad Request)

AWSApp1TestAWSApp2Test 通信

(HTTP/1.1 200 OK)

LocalApp1AWSApp2Live 通信

(HTTP/1.1 200 OK)

如您所见,PHP App2 加载到 AWSApp2Test 并从 AWSApp1Test 发送请求时,它响应与(HTTP/1.1 200 OK)。但是当加载到 AWSApp2Live 并给出来自 AWSApp1LiveAWSApp1Test 的相同请求时,它会响应 (HTTP/1.1 400 错误请求)。 AWSApp2Live 唯一一次响应 (HTTP/1.1 200 OK) 是从 LocalApp1.[=18= 发送请求时]


目前已尝试修复

  1. 我们认为可能与 AWSApp2Live 软件配置上的 Zlib 输出压缩设置有关,但响应仍然相同。

  2. 我们已经从 LocalApp1 服务器和 AWSApp2Test 服务器为 AWSApp2Live 服务器,它们都返回相同的 IP 地址以排除任何 DNS 问题

  3. 我们通过 SSH 连接到 AWSApp1Test 服务器并对 AWSApp2Live 上的 API 命令之一执行了 wget 服务器,我们返回了 JSON 响应,这意味着它正在到达该服务器上的 PHP 应用程序。

  4. AwsApp2Live 服务器上没有生成日志,让我了解为什么服务器将某些请求视为错误请求,而另一些则不是。

  5. 使用 Postman (https://www.getpostman.com/) 我能够在 AWSApp2Live 上与 API 成功通信,所以应用程序是 运行 符合预期。


如有任何帮助,我们将不胜感激!

我们不确定去哪里寻找任何关于可能发生的事情的进一步线索。如果您需要任何进一步的信息,请告诉我们。非常感谢。

documentation 中没有任何内容,但我认为 headers 应该仅在其中只有一个的情况下作为字符串传递。否则使用数组:

$context = stream_context_create(array(
    'http' => array(
        'method' => 'POST',
        'header' => array(
            'Content-Type: application/x-www-form-urlencoded',
            'Cv-Forwarded-For: ' . $_SERVER["REMOTE_ADDR"]
        ),
        'content' => $query,
    ),
    'ssl'=>array(
        'verify_peer'=>false,
        'verify_peer_name'=>false
    )
));