Chromeでの重複リクエスト

チームの皆様、こんにちは。

当チームは Discourse フォーラムの運用を担当しており、Chrome でのみ重複リクエストが発生する問題に直面しています(Firefox や Safari では発生しません)。この問題は、Service Worker(Workbox)に関連しているのではないかと推測しています。

現在の構成は以下の通りです:

  1. ドメイン:https://example.com
  2. スクリプトはサブパスでホストされています:https://example.com/assets/myScript.js
  3. myScript は外部エンドポイントに対して GET リクエストを送信します:https://foobar.com/

問題の詳細:

  1. フォーラムを初めて訪問する際(またはハードリフレッシュ時)には、ブラウザから単一のリクエストが送信されます。
  2. 2 回目のリクエストでは、ブラウザから 2 つのリクエストが送信されます。1 つは Service Worker から提供されたファイル由来のもので、もう 1 つは fetchWrapper.mjs 由来です(workbox/packages/workbox-core/_private/fetchWrapper.mjs at 194cdeb63d5abb21490f88f01f02f4bcf7e6d54b · GoogleChrome/workbox · GitHub

追加情報:
https://github.com/discourse/discourse/blob/master/app/assets/javascripts/service-worker.js.erb#L18-L35 - これは Service Worker の作成を担当する設定です。Network first 戦略を使用しています。

解決策は?
認証の扱いと同様に(https://github.com/discourse/discourse/blob/master/app/assets/javascripts/service-worker.js.erb#L10)、/analytics/ をルートとして公開するか、ユーザーが NetworkOnly に設定されたカスタムルートの配列を渡せるように設定可能にします。当社の環境は Docker と EC2 で構成されているため、これらでも同様に公開する必要があります。

両方のリクエストが実際にネットワークに到達していることは確かですか?2 番目のリクエストは、おそらく 1 番目のリクエストへの応答として使用されているのでしょう。

はい。私たちの環境では、この問題が分析コードで発生しており、その結果、分析データが二重に記録されています。

それらは重複したリクエストではなく、Chrome 開発者ツールがサービスワーカーのプロキシを表示する際の単なる特徴に過ぎません。

また、アプリケーションログを確認すると、/latest.json のようなどのルートに対してもサーバーに重複したリクエストが届いていないことがわかります。

したがって、これは Discourse のバグではありません。

チーム、どうもありがとうございます。確かにこれは Chrome の特有の挙動です。データは重複が排除されているにもかかわらず、Chrome が複数のリクエストを表示しています。