net :: ERR_HTTP2_PROTOCOL_ERRORとは何ですか?


36

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

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

  1. HTTPSでWebサイトにアクセスしています

  2. https://publish.twitter.comを介して統合された私のTwitterフィード がまったくロードされない

  3. コンソールでERR_HTTP2_PROTOCOL_ERRORに気づく

  4. Twitterフィードをロードするコードを削除すると、エラーが残る

  5. HTTPでWebサイトにアクセスすると、Twitterフィードが表示され、エラーが消えます

Google Chromeは、エラーをトリガーする唯一のWebブラウザーです。これは、EdgeとFirefoxの両方でうまく機能します。(注:Safariを試しましたが、同様のkcferrordomaincfnetwork 303エラーが発生します)

エラーにこの「200」の言及があり、404/500ページが何もトリガーしていないため、サーバーから返されたヘッダーに関連しているのではないかと思っていました。

ことは、エラーがまったく文書化されていないことです。Google検索で結果がほとんどない。さらに、私はそれがごく最近のGoogle Chromeリリースに現れていることに気づきました。エラーはv.64.Xでは発生しませんが、v.75以降では発生します(OSに関係なく、Macで作業しています)。

この時点で調査するための手がかりは喜んでいただければ幸いです。

前もって感謝します。

トリスタン


編集1:FirefoxではWebサイトに関連しているが、Safari(kCFErrorDomainCFNetworkエラー303)では関連していない可能性があるChrome(net :: ERR_SPDY_PROTOCOL_ERROR)


編集2:さらなる調査の結果は次のとおりです。

  • サーバーが2XXではなく404を返す場合、エラーはまったく同じページに表示されません
  • ローカルでHTTPS証明書を使用してもエラーが表示されない
  • 別の証明書を使用する別のサーバー(どちらもOVHのサーバー)でエラーが発生する
  • 5.6から7.3まで、使用されているPHPのバージョンに関係なくエラーが発生します(使用されるフレームワーク:Cakephp 2.10)

編集3:リクエストに応じて、以下は失敗したリソースに対して返されるヘッダーです。これはWebページ全体です。エラーがHTTPヘッダー200を持つ各ページでトリガーされている場合でも、それらのページは常にクライアントのブラウザーに読み込まれますが、要素が欠落している場合があります(私の例では、外部Twitterフィード)。[ドキュメント]自体を除いて、[ネットワーク]タブの他のすべてのアセットは成功を返します。 コンソールで失敗した行

Google Chromeヘッダー(エラーあり):

クロムヘッダー

Firefoxヘッダー(エラーなし):

Firefoxヘッダー

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

編集4: 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を送信すると、全体の前にサーバーに到着する可能性が高くなります。応答コンテンツが送信されるため、帯域幅が節約されます。

記述されている動作は、私が観察できる動作と同じです。しかし、それはブラウザが犯人であることを意味し、200ヘッダーと404ヘッダーを持つ2つの同一ページでなぜそれが発生するのか理解できません(JSを無効にしても同じです)。



私は明らかにここにいましたが、クライアント側に関連する回答しかなく、これは解決策にはなりません。
Tristan G

エラーはChrome以外のブラウザで発生しますか?そうでない場合、クライアント側(特にChrumブラウザ)の問題ではないのですか?
Jaromanda X

1
不正なHTTP応答ヘッダーの可能性があります。サイト全体が読み込まれていませんか?または、1つ以上のアセットだけですか?質問を編集して、HTTP / 2の使用時に読み込まれないアセットのHTTP応答に表示されるHTTP応答ヘッダーを含めることができますか?また、それが機能するEdge / Firefox向けですか?
バリーポラード、

1
そこには何も問題が見当たらないので、それが主な要求ではないことが疑われます。また、クッキーのことは無視してください-それはそうではありません。これを試して、理解できるかどうかを確認してください。 michalspacek.com/...
バリー・ポラード

回答:


7

数週間、私はこの「バグ」にも悩まされていました。

net :: ERR_HTTP2_PROTOCOL_ERROR 200

私の場合、PHPで生成された画像で発生しました。

それはheader()レベルにあり、特にこれについては:

header ('Content-Length:'. Filesize($cache_file));

それは明らかに正確なサイズを返さなかったので、私はそれを削除し、すべてが今はうまくいきます。

したがって、Chromeはヘッダーを介して送信されるデータの正確性をチェックし、一致しない場合は失敗します。

編集

content-lengthvia filesizeが誤って計算されていた理由を発見GZIPしました。PHPファイルで圧縮がアクティブであるため、問題のファイルを除外すると問題が解決します。このコードを次の場所に配置し.htaccessます。

SetEnvIfNoCase Request_URI ^ / thumb.php no-gzip -vary

それは動作し、ヘッダーを保持しContent-lengthます。


1
ありがとうございます。しかし、私はまだ本当の問題を理解していません。私の場合、エラーはhttpsでのみ発生し、httpでは発生しません。
Nico

こんにちは@Nico、はい、それは正常だと思います。発表されたサイズとブラウザ(Chrome)によってダウンロードされたファイルのサイズとの間の検証は、httpsプロトコルでのみ行われるべきです。この解決策があなたを助けることができることを非常に嬉しく思います!
Xtendo

1
どういうわけか「Content-Length」の代わりに「Content -Length」を使用することができました。スペースを削除した後、それは働いた。ありがとうございました。
マーティンロッテリング

こんにちは、@ Martin Lotteringこれはあなたのためにうまくいきました!:-)
Xtendo

6

何が起こっているのか正確にはわかりませんでしたが、解決策を見つけました。

OVHCDN機能が原因でした。ホストサービスにインストールしましたが、不要だったためドメインで無効にしました。

どういうわけか、それを有効にすると、すべてが機能します。

私はそれがApacheにHTTP2プロトコルを使用することを強制すると思いますが、私が理解していないことは、実際に私のヘッダーのそれぞれにHTTP2の言及があったということです。

したがって、私の非常に特殊なケースの解決策は、関係するすべてのドメインでCDNオプションを有効にすることでした。

ここで何が起こったかを誰かがよく理解している場合は、説明を自由に共有してください。


cdnキャッシュのパージは私にとっては
うまくいっ

4

http2サーバーが接続を閉じたため、これに遭遇しましたこれは、Chromeに大きな応答を送信するときに。

どうして?これは、WriteTimeoutという名前のhttp2サーバーの単なる設定であるためです


4

私の場合は-Webサーバーにディスク領域が残っていませんでした。


興味深いことに、私にとっては同じですが、フロントWebサーバーのディスクがいっぱいでした。ログに目立ったものがないため、nginxはこの状況をキャッチしないようです。
vchrizz

3

同様の問題が発生し、HTTP GETリクエストの1つでERR_HTTP2_PROTOCOL_ERRORが発生しました。

Chromeの更新が保留中であることに気付いたので、Chromeブラウザーを最新バージョンに更新し、次回ブラウザーを再起動したときにエラーが発生しなくなった。


2

node-jsアプリケーションを外部の世界に公開するNginxサーバーがあると、この問題が発生しました。Nginxはファイル(css、jsなど)gzipをChromeで圧縮し、Chromeでも同じように見せました。

node-jsサーバーもコンテンツをgzipで圧縮していることがわかったときに問題は解決しました。どういうわけか、この二重圧縮はこの問題を引き起こします。node-js圧縮をキャンセルすると問題が解決しました。


6
何人かがこの投稿にすでに回答していて、そのたびに問題の根本が何か違っていたのを見るのは興味深いことです。このエラーは確かにかなり混乱していると思います。
Tristan G

2

このエラーは現在修正中です:https : //chromium-review.googlesource.com/c/chromium/src/+/2001234

しかし、それは私を助け、nginx設定を変更しました:

  • gzipをオンにします。
  • add_header 'Cache-Control' 'no-store、no-cache、must-revalidate、proxy-revalidate、max-age = 0';
  • 期限切れ。

私の場合、NginxはNode.jsアプリケーションのリバースプロキシとして機能します。


この答えは私にも役立ちました。適切な構文については、このリンクdocs.nginx.com/nginx/admin-guide/web-server/compressionに従ってください
Bhargavi Gopalachar

1

これは、example.com(new.example.com)の「new」などの新しいドメイン名を登録したときに起こりました。名前は海外で解決できたが、私の場所では数時間一時的に解決できなかった。そこで、プロキシを使用して、見たWebサイトをテストしましたnet::ERR_HTTP2_PROTOCOL_ERRORいくつかのAJAX投稿についてChromeコンソールで表示しました。数時間後、名前がローカルで再び愛されるようになったとき、それらのエラーは消えました。

そのエラーの理由は、これらのAJAXリクエストがプロキシによってリダイレクトされなかったためだと思います。ローカルDNSリゾルバーによって解決されていないWebサイトにアクセスするだけです。



0

1MBを超えるファイルを投稿すると、同じ問題(asp、c#-HttpPostedFileBase)が発生しました(アプリケーションにファイルサイズの制限はありません)。モデルクラスの簡略化が役立ちました。この問題が発生した場合は、モデルの一部を削除してみて、それが何らかの形で役立つかどうかを確認してください。奇妙に聞こえますが、私にとってはうまくいきました。


0

この1週間、AJAXを介してDELETEリクエストをPHPサーバーに送信しようとしたため、この問題が発生しています。私は最近、ホスティングプランをアップグレードしました。このプランでは、PHPとJSファイルを保存するSSL証明書をホストに持っています。SSL証明書を追加してから、この問題は発生しなくなりました。これがこの奇妙なエラーに役立つことを願っています。


0

私もこのエラーに直面しましたが、その背後には複数の理由が考えられます。私の場合、ARRはタイムアウトになりました。

私の場合、リダイレクトルールを設定したリバースプロキシサイトにブラウザがリクエストを出しており、そのプロキシサイトが最終的に実際のサイトをリクエストしています。巨大なデータの場合、2分5秒以上かかり、サーバーのApplication Request Routingタイムアウトは2分に設定されました。以下の手順でARRタイムアウトを増やすことでこれを修正しました。1. IISに移動します。2.サーバー名をクリックします。3.中央のペインで[Application Request Routing Cache]をクリックします。4.右ペインで[サーバープロキシ設定]をクリックします。5.タイムアウトを増やします6 。「適用」をクリックします


0

私たちの場合、理由は無効なヘッダーでした。編集4で述べたように:

  • ログを取る
  • ビューアでイベントを選択します
  • HTTP2_SESSIONを選択

同様の何かを探してください:

HTTP2_SESSION_RECV_INVALID_HEADER

->エラー= "ヘッダー名に無効な文字があります。"

-> header_name = " charset = utf-8 "


0

私のチームは、これを、提供していた単一のJavaScriptファイルで確認しました。他のすべてのファイルは正常に機能しました。http2バックからhttp1.1次に、net::ERR_INCOMPLETE_CHUNKED_ENCODINGまたはに切り替えましたERR_CONTENT_LENGTH_MISMATCH。私たちは最終的に、「情報漏えい」を誤って検出している企業フィルター(Trustwave)があることを発見しました(社会保障番号に似たファイル/ファイル名で何かを検出したと思われます)。企業にこのフィルタを微調整させることで問題が解決しました。


0

Base64文字列が長いページでこの問題が発生しました。CloudFlareを使用しているため、問題が発生します。

詳細:https : //community.cloudflare.com/t/err-http2-protocol-error/119619

フォーラム投稿の重要なセクション:

複数のブラウザのシークレットタブでさらにテストを行った後、BASE64から実際の.png画像にコードを変更したところ、どのブラウザでも問題が再発することはありませんでした。.pngは、base64になる前に約500 kbありました。そのため、CloudFlareには、ドメインとherokuの間のプロキシとして同じ行に大量のテキスト行(base64は長い文字列であるため)に関する問題があります。前述のように、HerokuのURLに直接アクセスしても問題は発生しませんでした。

一時的なハックは、CloudFlareでHTTP / 2を無効にすることです。

CloudFlareでHTTP / 2を無効にする必要のない、より良いソリューションを他の誰かが作成できることを願っています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.