[解決済み] net::ERR_HTTP2_PROTOCOL_ERROR は何ですか?
質問
現在、あるウェブサイトを制作しているのですが、そのウェブサイトでは
net::ERR_HTTP2_PROTOCOL_ERROR 200
エラーが発生します。何がこのエラーを引き起こすのか正確には分かりませんが、HTTPS でウェブサイトにアクセスしたときだけポップアウトすることに気づきました。私はそれが関連していると 100% 確信することはできませんが、JavaScript が適切に実行されるのを妨げているように見えます。
たとえば、次のようなシナリオが発生します。
-
HTTPSでウェブサイトにアクセスしている
-
私のツイッターフィードが統合されたのは https://publish.twitter.com がまったく読み込まれません。
-
コンソールで ERR_HTTP2_PROTOCOL_ERROR が表示されているのがわかります。
-
Twitterフィードを読み込むコードを削除すると、エラーは残ります。
-
HTTPでアクセスすると、Twitterのフィードが表示され、エラーも消えます
エラーが発生する Web ブラウザは Google Chrome のみです。Edge と Firefox の両方でうまく動作します。
(NB: Safari で試しましたが、同様の
kcferrordomaincfnetwork 303
エラーが発生します)。
エラーにこの「200」の記載があり、404 / 500ページでは何もトリガーされないので、サーバーから返されるヘッダーに関連する可能性があるかと思いました。
問題は、このエラーがまったく文書化されていないことです。Google で検索しても、ほとんどヒットしません。さらに、非常に最近の Google Chrome リリースで表示されることに気づきました。エラーは v.64.X では発生しませんが、v.75 以上では発生します (OS に関係なく、私は Mac で作業しています)。
に関連している可能性があります。 Firefox ではウェブサイトは OK ですが、Safari (kCFErrorDomainCFNetwork エラー 303) でも Chrome (net::ERR_SPDY_PROTOCOL_ERROR) でも OK ではありません。
さらなる調査から得られた知見は以下の通りです。
- エラーは、サーバーが 2XX の代わりに 404 を返す場合、まったく同じページでポップしません。
- HTTPS 証明書を持つローカルでエラーがポップアップしない
- エラーが別のサーバー (両方とも OVH のもの) で発生し、別の証明書を使用する
- PHP のバージョンが 5.6 から 7.3 であっても、エラーが表示される (使用したフレームワーク : Cakephp 2.10)
リクエスト通り、以下は失敗したリソースの返されたヘッダーで、これはウェブページ全体です。HTTP ヘッダー 200 を持つ各ページでエラーが発生した場合でも、これらのページは常にクライアントのブラウザで読み込まれていますが、時々要素が欠落しています (私の例では、外部の Twitter フィード)。ネットワーク]タブにある他のすべての資産は、ドキュメントそのものを除いて、成功のリターンを持っています。
Google Chromeのヘッダー(エラーあり)。
Firefoxのヘッダー(エラーなし)。
A
curl --head --http2
のリクエストをコンソールで実行すると、次のような成功が返されます。
HTTP/2 200
date: Fri, 04 Oct 2019 08:04:51 GMT
content-type: text/html; charset=UTF-8
content-length: 127089
set-cookie: SERVERID31396=2341116; path=/; max-age=900
server: Apache
x-powered-by: PHP/7.2
set-cookie: xxxxx=0919c5563fc87d601ab99e2f85d4217d; expires=Fri, 04-Oct-2019 12:04:51 GMT; Max-Age=14400; path=/; secure; HttpOnly
vary: Accept-Encoding
chrome://net-export/で深追いしてみたり。 https://netlog-viewer.appspot.com ツールは、リクエストが RST_STREAM で終了していることを教えてくれています。
t=123354 [st=5170] HTTP2_SESSION_RECV_RST_STREAM
--> error_code = "2 (INTERNAL_ERROR)"
--> stream_id = 1
で読んだものについては この他の投稿 , " HTTP/2では、クライアントがリクエストを中断したい場合、RST_STREAMを送信します。サーバーは RST_STREAM を受信すると、クライアントへの DATA フレームの送信を停止し、それによってレスポンス (またはダウンロード) を停止します。接続はまだ他のリクエストに使用可能であり、中止されたものと同時進行していたリクエスト/レスポンスは進行し続けることができる。 [...] RST_STREAMがクライアントからサーバーに移動するまでに、リクエスト のすべてのコンテンツが転送中にクライアントに到着し、クライアントはそれを 廃棄するということがありうる。しかし、大きな応答コンテンツでは、RST_STREAM を送信すると、応答コンテンツ全体が送信される前にサーバーに到着する可能性が高く、したがって帯域幅を節約することができます。 です。
記述された動作は、私が観察できる動作と同じです。しかし、それはブラウザが原因であることを意味し、そして私は1つが200ヘッダーを持ち、もう1つが404を持つ2つの同じページで起こる理由を理解できません(JSを無効にした場合も同様です)。
どのように解決するのですか?
具体的に何が起こっているのか分かりませんでしたが、解決策が見つかりました。
は OVHのCDN機能 が原因でした。ホストサービスにはインストールされていましたが、私のドメインでは必要ないので無効にしていました。
どういうわけか、それを有効にすると、すべてがうまくいくのです。
私は、それが Apache に HTTP2 プロトコルを使用するように強制していると思いますが、私が理解していないのは、確かに私の各ヘッダーに HTTP2 の言及があったことで、これは、サーバーが正しいプロトコルを使用して応答したことを意味すると推測しています。
つまり、私の非常に特殊なケースに対する解決策は、すべての関係するドメインで CDN オプションを有効にすることでした。
もし、ここで起こったかもしれないことをよりよく理解している人がいれば、遠慮なく説明を共有してください。
関連
-
[解決済み】PHP - 構文エラー、予期しないT_CONSTANT_ECAPSED_STRING [閉店].
-
[解決済み] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given [重複] PHP & MySQL: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean given.
-
[解決済み】 PHP 未定義関数の呼び出し
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】Chrome net::ERR_INCOMPLETE_CHUNKED_ENCODING エラーが発生しました。
-
[解決済み】MySQLのカラム数が1行目の値数と一致しない【非公開
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?
-
[解決済み] console.dirとconsole.logの違いは何ですか?
-
[解決済み] YouTube APIからYouTubeビデオのサムネイルを取得する方法を教えてください。
-
[解決済み] 配列の最初の要素を取得する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Weird PHP error: 'Can't use function return value in write context'.
-
[解決済み】空の配列要素を削除する
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み】foreach()に与えられた引数が無効です。)
-
[解決済み】Chrome net::ERR_INCOMPLETE_CHUNKED_ENCODING エラーが発生しました。
-
[解決済み】警告:mysql_fetch_array()はパラメータ1がリソースであることを期待、ブール値は[重複]で与えられる]
-
[解決済み] PHP - ストリームを開くのに失敗しました : そのようなファイルまたはディレクトリがありません。
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?
-
[解決済み] mysql_field_nameを新しいmysqliに変更します。