web-dev-qa-db-ja.com

HTTPステータスコード200(キャッシュ)とステータスコード304の違いは何ですか?

Firefox用のGoogle「ページスピード」プラグインを使用して、Webサイトにアクセスしています。

ページの一部のコンポーネントは、HTTPステータスとして示されます。

200 200(キャッシュ)304

Googleの「ページ速度」による。

私が混乱しているのは、200(キャッシュ)と304の違いです。

ページを複数回更新しましたが(キャッシュをクリアしていません)、favicon.icoといくつかの画像がstatus = 200(キャッシュ)で、他の画像はhttpステータス304であるようです。

なぜ違いがあるのか​​分かりません。

UPDATE

Googleの「Page Speed」を使用すると、- http://example.com/favicon.icohttp://cdn.example。 com/js/ga.js

しかし、 http://cdn.example.com/js/combined.min.js のhttpステータス「304」を受け取ります

同じディレクトリ/ js /に2つのJavaScriptファイルがある理由がわかりません。1つはhttpステータス304を返し、もう1つは200(キャッシュ)ステータスコードを返します。

189
Hank

コード「200(キャッシュ)」のアイテムはブラウザのキャッシュから直接処理されました。つまり、アイテムの元のリクエストは、ブラウザがそれらをキャッシュできることを示すヘッダー(たとえば、未来の日付のExpiresまたはCache-Control: max-ageヘッダー)とともに返され、新しいリクエストをトリガーした時点では、これらのキャッシュされたオブジェクトはまだローカルキャッシュに保存されており、まだ期限が切れていませんでした。

一方、304は、ブラウザがキャッシュした最後のバージョン以降にファイルが変更されたかどうかをブラウザがチェックした後のサーバーの応答です(答えは「いいえ」です)。

最適なWeb​​パフォーマンスを得るには、すべてのアセットに遠​​い将来のExpires:またはCache-Control: max-ageヘッダーを設定し、アセットを変更する必要がある場合、アセットの実際のファイル名を変更するか、そのリクエストにバージョン文字列を追加するのが最善です資産。これにより、アセットがキャッシュ内のバージョンから明確に変更されていない限り、要求を行う必要がなくなります(304応答は不要です)。 Yahoo! キャッシュ関連のパフォーマンスガイドライン があります。これには、ETagが正しく構成されていることの確認が含まれます。

214
Ben Regenspan

200(キャッシュ)は、Firefoxが単にローカルにキャッシュされたバージョンを使用していることを意味します。 Webサーバーへの要求が行われないため、これが最速です。

304は、Firefoxが「If-Modified-Since」条件付きリクエストをWebサーバーに送信していることを意味します。ブラウザから送信された日付以降にファイルが更新されていない場合、Webサーバーは基本的にFirefoxにキャッシュバージョンを使用するよう指示する304応答を返します。要求はまだWebサーバーに送信されますが、サーバーはファイルの内容を送信する必要がないため、200(キャッシュ)ほど高速ではありません。

最後の質問に、同じディレクトリ内の2つのJavaScriptファイルが異なる結果を返す理由がわかりません。

61
James Lawruk

これも私を長い間投げました。最初に確認することは、更新ボタンをクリックしてページをリロードしていないことです。これにより、常にリソースに対する条件付きリクエストが発行され、多くのページ要素に対して304が返されます。代わりにURLバーに移動してページを選択し、同じURLを再度入力したかのようにEnterキーを押すと、適切にキャッシュされているものをより適切に示すことができます。この記事では、条件付きリクエストと無条件リクエストの違いと、更新ボタンがそれらにどのように影響するかを説明しています。 http://blogs.msdn.com/b/ieinternals/archive/2010/07/08/technical-情報約条件付きHTTPリクエストと更新ボタン.aspx

18
Pooch

HTTP 304は「変更されていません」。 Webサーバーは基本的にブラウザに「このファイルは最後に要求してから変更されていません」と伝えています。一方、HTTP 200はブラウザに「成功した応答があります」と伝えています。ブラウザがファイルに初めてアクセスしたとき、または変更されたコピーに最初にアクセスしたときに返されます。

ステータスコードの詳細については、 http://en.wikipedia.org/wiki/List_of_HTTP_status_codes をご覧ください。

8
richleland

304は変更されていません。 cssやjsなどのメディアファイルでこのコードをたくさん取得します。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5

2
Brandon Henry

最後の質問については、なぜですか?私が知っていることで説明しようとします

素人の言葉でこれらの3つのステータスコードの簡単な説明。

  • 200-成功(ブラウザー要求およびサーバーからのファイル取得)

サーバーでキャッシュが有効になっている場合

  • 200(メモリキャッシュから)-ブラウザでファイルが見つかったため、ブラウザはサーバーからの要求を送信しません
  • 304-ブラウザーはファイルを要求しますが、サーバーによって拒否されます

一部のファイルについては、ブラウザはサーバーからのリクエストを決定し、一部のファイルについては、保存された(キャッシュされた)ファイルからの読み込みを決定します。どうしてこれなの ?すべてのファイルには有効期限があるため、

ファイルの有効期限が切れていない場合、ブラウザはキャッシュから使用します(200キャッシュ)。

ファイルの有効期限が切れている場合、ブラウザはサーバーにファイルを要求します。両方の場所(ブラウザとサーバー)のサーバーチェックファイル。同じファイルが見つかった場合、サーバーは要求を拒否します。プロトコルごとに、ブラウザは既存のファイルを使用します。

このnginx設定を見てください

location / {
    add_header Cache-Control must-revalidate;
    expires     60;
    etag on;

    ...
}

ここでは、有効期限は60秒に設定されているため、すべての静的ファイルは60秒間キャッシュされます。したがって、60秒以内に再度ファイルを要求すると、ブラウザはメモリ(200メモリ)から読み取ります。 60秒後にリクエストすると、ブラウザはサーバー(304)をリクエストします。

ファイルは60秒後に変更されないと仮定しました。その場合、200を取得します(つまり、更新されたファイルはサーバーから取得されます)。

そのため、サーバーが異なる期限切れヘッダーとキャッシュヘッダー(ポリシー)で構成されている場合、ステータスが異なる場合があります。

あなたの場合、cdnを使用している場合、cdnの主な目的は高可用性と高速配信です。したがって、複数のサーバーを使用します。ファイルは同じディレクトリにあるように見えますが、cdnは複数のサーバーを使用してuコンテンツを提供します(サーバーの構成が異なる場合)。その後、これらのステータスは変更できます。それが役に立てば幸い。