「304 Not Modified」はどのように正確に機能しますか?


174
  • 「304 Not Modified」応答はどのように生成されますか?

  • ブラウザはHTTPリクエストへの応答が304かどうかをどのように判断しますか?

  • ブラウザで設定されているか、サーバーから送信されていますか?

  • サーバーから送信された場合、サーバーはどのようにしてキャッシュ内の使用可能なデータを認識し、どのように304を画像に設定しますか?

それがブラウザによって生成された場合、私の推測:

function is_modified()
{
    return get_data_from_cache() === get_data_from_url();
}

function get_data_from_cache()
{
    return some_hash_or_xxx_function(cache_data);
}

function get_data_from_url()
{
     return some_hash_or_xxx_function(new_data);
}

function some_hash_or_xxx_function(data)
{
     // Do something with the data.
     // What is that algorithm?
     return result;
}

console.log(is_modified());

データの取得、解析、データベースへのプッシュをサードパーティのAPIプロバイダーに依存しています。データはリクエストごとに変更される場合と変更されない場合がありますが、ヘッダーは常にを送信します200。私はむしろ私のDBに最後のユニークIDをチェックして、その上で...データの変化を決定するために、また結果を直接比較、解析したくないmd5()sha1()crc32()の結果をハッシュ化し、罰金を動作しますが、私は疑問を抱いています決定するアルゴリズム304

同じ種類のアルゴリズムを使用して、データの変化を判別したいと思います。


2
はい、304が変更されていないことを確認しましたが、回答がありませんでした。
VenomVendor 2014年

1
あなたはもう少し一般的である必要があります。 google.com/search?q=http%20caching
2014年

回答:


200

ブラウザがキャッシュに何かを置くと、サーバーからのLast-ModifiedまたはETagヘッダーも保存されます。

次に、ブラウザーはIf-Modified-Sinceor If-None-Matchヘッダーを含む要求を送信し、コンテンツにまだその日付またはETagがあるかどうかを304に送信するようサーバーに指示します。

サーバーは、各リソースの各バージョンの日付変更またはETagを計算する何らかの方法を必要とします。これは通常、ファイルシステムまたは個別のデータベース列から取得されます。


1
ETagヘッダーでチェックされたキーワードです。ETag両方のResponse HeadersResponse Headers From Cacheで同じままですETag。背後にあるアルゴリズムを教えてください。要件を記載した質問を更新しました。
VenomVendor 2014年

4
@VenomVendor:ETagサーバーが一意のID(通常はハッシュ、バージョン番号、またはベクトルクロック)を格納できるフィールドです。そのIDの計算にはまったく役立ちません。それはサーバーサイドのコード次第です。
SLaks 2014年

@SLaks:ページにdb呼び出しがあるとどうなりますか... db内のデータが変更された可能性があります。この場合、最後に変更された呼び出しを確認することは意味がありません。この状態はどのように調べられますか?
user1050619

3
@ user1050619:ETagが正確であることを確認するのはサーバーの責任です。DBからのデータを表示する場合は、それを含める必要があります。
SLaks、2014年

まだはっきりしていないことの1つは、大容量のmax-age場合、ブラウザーが要求を行う必要があるかどうかです。(304でスタブし、リクエストをまったく作成しない可能性があるため)...たとえば、「フィンガープリント」されたアセット(これは永久に有効です)でこれを必要とします。他に何がポイントなのかmax-age...
アンディ・ヘイデン

19

Last-Modified:リクエストされたオブジェクトの最終変更日

If-Modified-Since:最終更新日が変更されていない場合に304 Not Modifiedを返すことができます。

ETag:ETagは、URLにあるリソースの特定のバージョンにWebサーバーによって割り当てられる不透明な識別子です。そのURLのリソース表現が変更されると、新しく異なるETagが割り当てられます。

If-None-Match:ETagが変更されていない場合に304 Not Modifiedを返すことができます。

ブラウザーストアキャッシュの日付(最終更新日)またはID(Eタグ)。URLを再度要求する必要がある場合、ブラウザーはヘッダー付きの要求メッセージを送信します。

ここに画像の説明を入力してください

ifステートメントがFalseの場合、サーバーは304を返し、ブラウザはキャッシュを使用します。

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