web-dev-qa-db-ja.com

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

  • "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 data
  // what is that algorithm.?
      return result;
}

console.log(is_modified());

私は、データを取得し、解析し、それをDBにプッシュするために、サードパーティのAPIプロバイダに依存しています。データはリクエストごとに変わる可能性がありますが、ヘッダーは常に200を送信します。解析したくない、DB内の最後の一意のIDをチェックするなどの方法でデータの変更を判断しますmd5()sha1()crc32()結果をハッシュして問題なく動作しますが、304を決定するアルゴリズムを考えていませんでした。

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

159
VenomVendor

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

ブラウザはIf-Modified-SinceまたはIf-None-Matchヘッダーを付けてリクエストを送信し、コンテンツにまだその日付またはETagがある場合は304を送信するようにサーバーに指示します。

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

186
SLaks

最終更新日:要求されたオブジェクトの最終更新日

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

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

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

uRLを再度要求する必要があるときに、日付(Last-Modified)またはID(ETag)を指定したブラウザストアキャッシュ。ブラウザは、ヘッダ付きの要求メッセージを送信します。

enter image description here

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

15
宏杰李