質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.39%
cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTTP2

HTTP2は、Hypertext Transfer Protocolのバージョンの1つでWWWで用いられます。接続を多重化し複数のリクエスト処理でき、HTTP1.1との互換性を持たせています。

Q&A

解決済

2回答

7802閲覧

HTTPのバージョン違いによる ERR_SPDY_PROTOCOL_ERROR

crescens

総合スコア9

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

HTTP2

HTTP2は、Hypertext Transfer Protocolのバージョンの1つでWWWで用いられます。接続を多重化し複数のリクエスト処理でき、HTTP1.1との互換性を持たせています。

0グッド

1クリップ

投稿2018/01/24 02:23

編集2018/01/29 05:49

前提・実現したいこと

PHPのcURLでWeb APIを叩いて出力結果を表示したいのですが、
プログラムを実行するサーバ(以下A)とWeb API提供元(以下B)に
HTTPのバージョンの違いがあるのでGoogle Chrome で以下のエラーが発生します。

発生している問題・エラーメッセージ

POST https://*** net::ERR_SPDY_PROTOCOL_ERROR

(A)がHTTP2導入済み、(B)がHTTP2未導入です。(A)のHTTP2をオフにすると、エラーは発生しません。
HTTP2をオフにする以外の対処法がありましたらご教授ください。

ソースコード

PHP

1<?php 2 $url = "(B)のURL"; 3 $ch = curl_init(); 4 curl_setopt( $ch, CURLOPT_URL, $url ); 5 curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true ); 6 curl_setopt( $ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 ); 7 $result = curl_exec( $ch ); 8 curl_close(); 9 echo $result; 10?>

(A)のサーバ環境

OS:CentOS 7.4
Webサーバ:nginx 1.13.8
SSL:OpenSSL 1.0.2k
他:PHP 7.2、cURL 7.57.8

1/29追記

(A)のnginxの設定

■nginx.conf

conf

1user nginx; 2worker_processes 1; 3 4error_log /var/log/nginx/error.log warn; 5pid /var/run/nginx.pid; 6 7events { 8 worker_connections 1024; 9} 10 11http { 12 include /etc/nginx/mime.types; 13 default_type application/octet-stream; 14 15 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 16 '$status $body_bytes_sent "$http_referer" ' 17 '"$http_user_agent" "$http_x_forwarded_for"'; 18 19 access_log /var/log/nginx/access.log main; 20 21 sendfile on; 22 #tcp_nopush on; 23 24 resolver 127.0.0.1; 25 26 keepalive_timeout 65; 27 28 #gzip on; 29 brotli on; 30 31 server_tokens off; 32 add_header X-Frame-Options SAMEORIGIN; 33 add_header X-XSS-Protection "1; mode=block"; 34 add_header X-Content-Type-Options nosniff; 35 36 include /etc/nginx/conf.d/vhost.conf; 37 #include /etc/nginx/conf.d/*.conf; 38}

■conf.d/vhost.conf

conf

1server { 2 listen 80 default_server; 3 listen [::]:80 default_server; 4 server_name example.com; 5 root /var/www/html; 6 error_log /var/log/nginx/error.log; 7 access_log /var/log/nginx/access.log main; 8 9 location / { 10 index index.html index.htm index.php; 11 } 12 13 # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 14 # 15 location ~ .php$ { 16 fastcgi_pass unix:/var/run/php-fpm/www.sock; 17 fastcgi_index index.php; 18 fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; 19 include fastcgi_params; 20 } 21 22 include ssl.conf; 23}

■conf.d/ssl.conf

conf

1# 2# conf.d/ssl.conf 3# 4 5#listen 443 ssl http2; 6listen 443 ssl; 7ssl_session_cache shared:le_nginx_SSL:1m; 8ssl_session_timeout 1440m; 9add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains' always; 10 11ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 12ssl_prefer_server_ciphers on; 13 14ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256 ECDHE-ECDSA-AES256-GCM-SHA384 ECDHE-ECDSA-AES128-SHA ECDHE-ECDSA-AES256-SHA ECDHE-ECDSA-AES128-SHA256 ECDHE-ECDSA-AES256-SHA384 ECDHE-RSA-AES128-GCM-SHA256 ECDHE-RSA-AES256-GCM-SHA384 ECDHE-RSA-AES128-SHA ECDHE-RSA-AES128-SHA256 ECDHE-RSA-AES256-SHA384 DHE-RSA-AES128-GCM-SHA256 DHE-RSA-AES256-GCM-SHA384 DHE-RSA-AES128-SHA DHE-RSA-AES256-SHA DHE-RSA-AES128-SHA256 DHE-RSA-AES256-SHA256 EDH-RSA-DES-CBC3-SHA"; 15 16ssl_stapling on; 17ssl_stapling_verify on; 18 19if ($scheme != "https") { 20 return 301 https://$host$request_uri; 21} 22ssl_certificate /etc/pki/tls/certs/2017.crt; 23ssl_certificate_key /etc/pki/tls/private/2017.key; 24ssl_trusted_certificate /etc/pki/tls/certs/2017.intermediate;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

(B)がHTTP2未導入です。

であれば、HTTP/2によるアクセスは不可能です。「HTTP2をオフにする以外の対処法」はありません。


ところで、「(A)がHTTP2導入済み」とはどういうことでしょうか。AのHTTPサーバがHTTP/2に対応していても、それはAからBに行うHTTP通信には全く関係しません。

投稿2018/01/24 03:48

maisumakun

総合スコア145791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

crescens

2018/01/26 07:42

回答ありがとうございます。 HTTP2のオフは、nginxのSSLのlisten設定を「listen 443 ssl;」のみにすることで対応しました。 nginxのSSLのlisten設定を「listen 443 ssl http2;」にしたまま、Web APIをたたくときだけhttp1.1通信にしたいと考え、cURLで「curl_setopt( $ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1 );」とオプションを設定しましたがエラーのままでした。 cURLのオプションを設定することによってhttp1.1アクセスが不可能でしたら諦めます。 > ところで、「(A)がHTTP2導入済み」とはどういうことでしょうか。AのHTTPサーバがHTTP/2に対応していても、それはAからBに行うHTTP通信には全く関係しません。 全く関係しないのであれば、nginxのhttp2をオフにしたときにエラーが発生せず、nginxのhttp2設定をオンにしたときに「ERR_SPDY_PROTOCOL_ERROR」が発生する理由は何でしょうか?
guest

0

ベストアンサー

maisumakun さんへのコメントで理解しましたが、ものすごいミスリードですね^^;

現象は以下で正しいでしょうか?
・問題発生は A サーバに対してブラウザからの POST
・A の HTTP/2 をオンにするとエラーERR_SPDY_PROTOCOL_ERRORが発生する
オフにするとエラーは発生しない

A の HTTP/2 の通信が正しく行われていないのではないかと思います。
・そもそも、POST 以外のアクセスで、エラーが出ていないか?
を確認してみてください。

ちなみにですが、A で行っている処理(php による B へのアクセス)は本件に無関係です。
あくまで、ブラウザと A サーバとの HTTP/2 接続の中で問題が発生しています。

追記
nginx -V で built with OpenSSL が 1.0.2 になっているか確認してください。

投稿2018/01/26 09:15

編集2018/01/26 09:26
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

crescens

2018/01/26 11:07

回答ありがとうございます。ミスリード申し訳ないです。精進します! 現象は、AサーバからBサーバへのPOSTです。Aサーバでは以下のサイトを参考にしてプログラムを作成しました。 https://stella-design.biz/2016/03/10/001405.html AのHTTP2をオンにするとエラーが発生するのは、おっしゃる通りです。 AからBへのPOST以外はHTTP2が利用できていることを、Google Chromeのデベロッパーツールで確認しています。AからBへのPOSTだけ失敗します。 なお、nginx -Vの出力結果の一部は以下のとおりです。 $ nginx -V nginx version: nginx/1.13.8 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) built with OpenSSL 1.0.2k-fips 26 Jan 2017
退会済みユーザー

退会済みユーザー

2018/01/26 12:04

ERR_SPDY_PROTOCOL_ERROR が発生するのは、ブラウザとAの通信においてという理解で正しいですか? で、解消したい現象は、このエラーをなくしたい? それとも、A から B への通信を HTTP/2 にしたい? ちなみにですが、A から B への通信は、ブラウザの開発ツールでは確認することが出来ません。ブラウザの開発ツールで確認できるのは、ブラウザと A の通信です。
crescens

2018/01/29 00:21

回答遅くなりまして申し訳ございません。 > ERR_SPDY_PROTOCOL_ERROR が発生するのは、ブラウザとAの通信においてという理解で正しいですか? おっしゃる通りです。開発ツールで表示しているのはAからBへの通信だと勘違いしておりました。 解消したい現象は、nginxの設定でHTTP/2をONにしたままこのエラーをなくしたいです。
退会済みユーザー

退会済みユーザー

2018/01/29 01:02

使用している環境は、HTTP/2に対応してそうなので、nginx の conf に問題がある可能性があります。 質問に追記すると、回答が得られるかもしれません。
crescens

2018/01/29 04:24

承知しました。ご丁寧な対応ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.39%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問