curl 意外的HTTP/1.x请求:开机自检/3/设备/XXXX

i5desfxk  于 2022-11-13  发布在  其他
关注(0)|答案(4)|浏览(566)

你好,我发送IOS推通知使用apns和curl在php和得到这个错误消息。
我还定义了“CURL_HTTP_VERSION_2_0”,但仍然出现此错误:
意外的HTTP/1.x请求:开机自检/3/设备/
下面是我的代码:

$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);
cl25kdpy

cl25kdpy1#

在PHP中使用cURL时,我得到了相同的Unexpected HTTP/1.x request: POST /3/device/XXXX响应,但在命令行中使用curl时却没有。
简单地用sudo apachectl restart重新启动apache web服务器就解决了这个问题。

bvk5enib

bvk5enib2#

问题:

对我来说,这是因为curl和/或我的服务器中缺少OpenSSL和nghttp 2。我也相信较旧版本的PHP(低于7. 0)也可能导致这个问题。
您可以在服务器上使用以下终端命令检查curl是否使用OpenSSL和nghttp 2:

curl -V

如果输出中没有提到OpenSSL和nghttp 2,则这就是您看到HTTP/1.x错误的原因。
我使用的是AWS EC2示例“Amazon Linux 2 AMI”。我找不到安装OpenSSL或nghttp 2的方法,所以我必须创建一个新的服务器,请参见下文。

解决方案:

我不得不创建一个新的AWS EC2示例'亚马逊Linux AMI 2018.03.0(HVM)'。
注意:不要创建“Amazon Linux 2 AMI(HVM)”的示例,因为您将以原始问题结束。
然后,我按照下面的步骤在新服务器上安装PHP7:How to install PHP 7 on EC2 t2.micro Instance running Amazon Linux Distro
然后我检查了curl版本,OpenSSL和nghttp 2都存在:

curl -V

然后我把所有的代码和资源放到新的服务器上,它工作了!
注意:我用来创建通知的实际PHP代码可以在这里找到:Send iOS Push notification in php with .p8 file

bbmckpt7

bbmckpt73#

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

46qrfjad

46qrfjad4#

请在您的php的curl包中启用您的http2
如果您已经启用了对curl的http2支持,请参见phpinfo()
之后,只需将CURLOPT_HTTP_VERSION curl选项设置为3

相关问题