HTTP服务器与另一台AWS服务器之间的HTTP / 1.1 400错误请求,但本地服务器与同一AWS服务器之间的HTTP / 1.1 200

时间:2017-03-31 03:04:22

标签: php http-status-code-400

参考

PHP App1 AWS实例

AWSApp1Live(运行PHP 5.5的64位Amazon Linux 2015.03 v1.4.6)

AWSApp1Test(运行PHP 5.6的64位Amazon Linux 2015.03 v1.3.2)

PHP App2 AWS实例

AWSApp2Live(运行PHP 5.6的64位Amazon Linux 2016.09 v2.3.2)

AWSApp2Test(运行PHP 5.5的64位Amazon Linux 2015.09 v2.0.4)

本地App1实例

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

概述

我有两个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实例上。请求/响应的以下组合

AWSApp1Live AWSApp2Live进行沟通

(HTTP/1.1 400 Bad Request)

AWSApp1Test AWSApp2Live进行沟通

(HTTP/1.1 400 Bad Request)

AWSApp1Test AWSApp2Test进行沟通

(HTTP/1.1 200 OK)

LocalApp1 AWSApp2Live 进行通信

(HTTP/1.1 200 OK)

正如您所看到的,PHP App2加载到 AWSApp2Test 并从 AWSApp1Test 发送请求时,它会响应(HTTP / 1.1 200 OK)。但是,当加载到 AWSApp2Live 并从 AWSApp1Live AWSApp1Test 发出相同请求时,它会响应(HTTP / 1.1 400错误请求)。唯一一次 AWSApp2Live 响应(HTTP / 1.1 200 OK)是从 LocalApp1 发送请求的时间。

到目前为止尝试修复

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

  2. 我们已经从 LocalApp1 服务器和 AWSApp2Test 服务器上为 AWSApp2Live 服务器完成了nslookup,并且他们返回相同的IP地址以排除任何DNS问题

  3. 我们通过SSH进入 AWSApp1Test 服务器并为 AWSApp2Live 服务器上的其中一个API命令执行wget,然后我们返回了一个JSON响应意味着它正在到达该服务器上的PHP应用程序。

  4. AwsApp2Live 服务器上没有生成任何日志,以便我了解服务器将某些请求视为错误请求而其他请求不是。

  5. 使用邮递员(https://www.getpostman.com/)我能够在 AWSApp2Live 上成功与API通信,以便应用程序按预期运行。

  6. 非常感谢任何帮助!

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

1 个答案:

答案 0 :(得分:1)

documentation中没有任何内容,但我认为标题只有在其中只有一个字符串时才会作为字符串传递。否则使用数组:

$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
    )
));
相关问题