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


201

FirefoxのGoogle "Page Speed"プラグインを使用してWebサイトにアクセスしています。

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

200 200(キャッシュ)304

Googleの「ページ速度」。

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

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

なぜその違いがわかりません。

更新

Googleの「ページスピード」を使用して、私はのために、「200(キャッシュ)」を受信http://example.com/favicon.icoなどhttp://cdn.example.com/js/ga.js

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

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

回答:


220

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

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

最も最適なウェブパフォーマンスを得るには、すべてのアセットに遠い将来のヘッダーExpires:またはCache-Control: max-ageヘッダーを設定し、アセットを変更する必要があるときに、アセットの実際のファイル名を変更するか、そのアセットのリクエストにバージョン文字列を追加することをお勧めします。これにより、アセットがキャッシュ内のバージョンから確実に変更されない限り、リクエストを行う必要がなくなります(304応答の必要はありません)。Googleには、長期キャッシュの正しい使用に関する詳細があります


2
では、速度の観点からは何が良いのでしょうか? "200(キャッシュ)"または "304" httpステータスメッセージ?
ハンク、

22
200キャッシュ。これに関するいくつかの良いメモ:developer.yahoo.com/performance/rules.html#expires。資産の有効期限をできる限り長くしたいのですが、この方法である程度の制御を失うという事実とこれとのバランスを取る必要があります。できることの1つは、ファイルに長期間有効期限を設定し、必要に応じてそれらのファイルのアセットバージョン番号をインクリメントすることです。たとえば、変更がある場合は、style.css?v1を含めて、<link>要素にインクリメントしてstyle.css?v2にすることができます。
ベンRegenspan 2009年

1
正直なところ、combined.min.jsが304 httpステータスを報告しているときに、ga.jsがローカルキャッシュ(ステータス= 200キャッシュ)からプルされているとFirebugが報告するのはなぜですか。奇妙なのは、両方のファイルが同じファイルタイプ(JavaScript)であり、同じサーバーディレクトリにあることです。どちらも200または304のどちらかであり、違いはないと思うでしょう
Hank

8
max-ageそしてageあれば合成ヘッダはまた、200(キャッシュ)結果をもたらすことができるage未満ですmax-age。1つの例外は、ユーザーがブラウザーの更新ボタンをクリックした場合です。この場合、304ヘッダーが送信されます。
yitwail

2
HTML5ボイラープレートは、キャッシュの無効化のクエリ文字列メソッドを使用しないことをお勧めします-それは変更する方が良いでしょうhrefurl,そしてsrc各ファイルへの参照は、「フィンガープリント」(ファイルのハッシュまたは単純なインクリメント番号のいずれか)を含み、その後、サーバーを伝えるためにその指紋を取り除いて、ただ提供するstyle.cssか、何でも。サーバーでそれができない場合は、ビルドシステムに実際のファイルの名前をフィンガープリントで変更させます。
iono 2013

62

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

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

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


18

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


1
CDNへのリクエストの304ステータスを把握するために費やした時間を説明することもできません。あなたは少し異なる質問に答えますが、賞金に値します:-)
Peeech

あなたが正しい:コードの違いは、リロードしている、または同じページではないという事実に関連しています。ページをリロードすると、ブラウザのネットワークモニタに304コードが表示されます。しかし、同じファイルを使用する別のURLにアクセスすると、ブラウザーのネットワークモニターに200(キャッシュから)コードが表示されます。私の場合、他のURLは、元のURLに追加されたクエリ文字列(ページは基本的に同じです)。
aldemarcalazans 2017

8

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

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


それも私の理解です...元の投稿で、ページを複数回更新しても、同じfavicon.icoおよび特定のJavaScriptインクルードの「200(キャッシュ)」が引き続き取得されると述べたのはそのためです。非常に奇妙です
ハンク、

2
200は実際にはキャッシュを意味するのではなく、単にOKを意味します。サーバー構成が明示的にそれは200のステータスコードを返すことになるだろう、あなたのICOとJSファイルをキャッシュするためにブラウザを教えてくれないことをチャンスです
richleland

一部のJavaScriptではb / cはそうではありません。304を受け取り、その他のJavaScriptでは「200(キャッシュ)」を受け取ります。すべてのJavaScriptは、同じWebサーバーディレクトリexample.com/js/内にあります
Hank

200(キャッシュ)を追加する必要があるのは、ローカルにキャッシュされており、実際にサーバーにリクエストを送信していないということです。これは、サーバーにアクセスして304応答を取得するよりも高速です。
リッチランド2009年

元の投稿を更新して、ライブサイトと問題のJavaScriptを表示しました。更新された元の投稿をご覧ください。
ハンク、

2

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

素人の言葉でこれらの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コンテンツを提供する場合があります(それらのサーバーの構成が異なる場合)。その後、これらのステータスは変化する可能性があります。それが役に立てば幸い。


304-変更なしは、サーバーによる「拒否」ではありません。これは、「要求しているバージョンについては、変更されていないため、ファイルは実際には必要ない」とクライアントに宣言するサーバーです。技術的には、304は「リダイレクト」応答コードの1つです。クライアントに「自分のキャッシュから取得」するように指示します。
Bob Kuhar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.