1. ホーム
  2. php

[解決済み] net::ERR_HTTP2_PROTOCOL_ERROR は何ですか?

2022-06-12 17:23:44

質問

現在、あるウェブサイトを制作しているのですが、そのウェブサイトでは net::ERR_HTTP2_PROTOCOL_ERROR 200 エラーが発生します。何がこのエラーを引き起こすのか正確には分かりませんが、HTTPS でウェブサイトにアクセスしたときだけポップアウトすることに気づきました。私はそれが関連していると 100% 確信することはできませんが、JavaScript が適切に実行されるのを妨げているように見えます。

たとえば、次のようなシナリオが発生します。

  1. HTTPSでウェブサイトにアクセスしている

  2. 私のツイッターフィードが統合されたのは https://publish.twitter.com がまったく読み込まれません。

  3. コンソールで ERR_HTTP2_PROTOCOL_ERROR が表示されているのがわかります。

  4. Twitterフィードを読み込むコードを削除すると、エラーは残ります。

  5. 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 オプションを有効にすることでした。

もし、ここで起こったかもしれないことをよりよく理解している人がいれば、遠慮なく説明を共有してください。