【问题标题】:Unexpected HTTP/1.x request: POST /3/device/XXXX意外的 HTTP/1.x 请求:POST /3/device/XXXX
【发布时间】:2018-05-18 16:10:34
【问题描述】:

您好,我在 php 中使用 apns 和 curl 发送 IOS 推送通知并收到此错误消息。

我还定义了“CURL_HTTP_VERSION_2_0”,但仍然出现此错误:

意外的 HTTP/1.x 请求:POST /3/device/

这是我的代码:

       $key_file = XXXXXX';
       $secret = null; 
       $private_key = JWKFactory::createFromKeyFile($key_file, $secret, [
                'kid' => '3W6B5LQQHX',
                'alg' => 'ES256',
                'use' => 'sig',
    ]);

    $payload = [
        'iss' => 'RUK725A7V4',
        'iat' => time(),
    ];

    $header = [
        'alg' => 'ES256',
        'kid' => $private_key->get('kid'),
    ];

    $jws = JWSFactory::createJWSToCompactJSON(
                    $payload, $private_key, $header
    );


    if (!defined('CURL_HTTP_VERSION_2_0')) {
        define('CURL_HTTP_VERSION_2_0', 3);
    }

        $http2_server = 'https://api.development.push.apple.com'; 
        $app_bundle_id = 'com.MD.example';

        $token = $device->device_id;
        $url = "{$http2_server}/3/device/{$token}";

        // headers
        $headers = array(
            "apns-topic: {$app_bundle_id}",
            'Authorization: bearer ' . $jws
        );

这是 curl 实际的 curl 请求。

         // other curl options
        curl_setopt_array($http2ch, array(
            CURLOPT_URL => $url,
            CURLOPT_PORT => 443,
            CURLOPT_HTTPHEADER => $headers,
            CURLOPT_POST => TRUE,
            CURLOPT_POSTFIELDS => $data,
            CURLOPT_RETURNTRANSFER => TRUE,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_HEADER => 1,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_2_0,
        ));
        $result = curl_exec($http2ch);

【问题讨论】:

  • 您找到解决方案了吗?我目前正面临这个确切的问题,并且真的找不到任何其他解决方案
  • 这里也一样,你找到解决方法了吗?

标签: php curl apns-php


【解决方案1】:

在 PHP 中使用 cURL 时,我得到了相同的 Unexpected HTTP/1.x request: POST /3/device/XXXX 响应,但在命令行上使用 curl 时却没有。

只需使用sudo apachectl restart 重新启动 apache 网络服务器即可解决问题。

【讨论】:

    【解决方案2】:

    问题:

    对我来说,这是因为 curl 和/或我的服务器缺少 OpenSSL 和 nghttp2。我也相信旧版本的 PHP(低于 7.0)也可能导致此问题。

    您可以在您的服务器上使用以下终端命令检查 curl 是否使用 OpenSSL 和 nghttp2:

    curl -V
    

    如果输出未提及 OpenSSL 和 nghttp2,那么这就是您看到 HTTP/1.x 错误的原因。

    我使用的是 AWS EC2 实例“Amazon Linux 2 AMI”。我找不到安装 OpenSSL 或 nghttp2 的方法,所以我不得不创建一个新服务器,见下文。

    解决方案:

    我必须创建一个“Amazon Linux AMI 2018.03.0 (HVM)”的新 AWS EC2 实例。

    注意:不要创建“Amazon Linux 2 AMI (HVM)”实例,因为您最终会遇到原始问题。

    然后我按照这个在新服务器上安装 PHP7: How to install PHP 7 on EC2 t2.micro Instance running Amazon Linux Distro

    然后我检查了 curl 版本,OpenSSL 和 nghttp2 都存在:

    curl -V
    

    然后我将所有代码和资源放到新服务器上,它就可以工作了!

    注意:我用来创建通知的实际 PHP 代码可以在这里找到: Send iOS Push notification in php with .p8 file

    【讨论】:

      【解决方案3】:

      我使用的是旧版本的 PHP,其中 phpinfo() 显示没有为 curl 库启用 HTTP2。将 PHP 升级到更新的版本为我解决了这个问题。

      【讨论】:

        【解决方案4】:

        请在你的 php 的 curl 包中启用你的 http2

        如果您已经启用了对 curl 的 http2 支持,请参阅 phpinfo()

        之后只需将 CURLOPT_HTTP_VERSION curl 选项设置为 3

        【讨论】:

          猜你喜欢
          • 2019-01-22
          • 1970-01-01
          • 2022-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多