web-dev-qa-db-ja.com

HTTPヘッダーのIf-None-Match:*はどういう意味ですか?

次のHTTP 1.1ヘッダーの意味は何ですか?

If-None-Match:*

強力なETagまたは弱いETag、またはETagのリストを使用する場合でも理解できますが、スター(*)を使用する場合にそれが使用されることを理解していません。

編集:「If-None-Match:*」への回答方法/内容を示す疑似コード(PHPコードも良い)があると便利です。

46
AlexV

答えは次のとおりです。

私たちが受け取ったと仮定します

If-None-Match: *
If-Modified-Since: <yesterday date>

そして、ページが変更されました 今日

まず、*これは、「リソースが存在し、条件(2)が満たされている場合は304を返す」ことを示しています。リソースは存在しますが、条件(2)は「日付が現在より遅い場合にのみ304を返します」と述べています。したがって、この条件は満たされず、ページは完全に配信されます。

受信していない場合はIf-Modified-Since、応答は304でした。

リクエスト時にリソースが存在していなかった場合、適切なコードを返していました(If-None-Match)。

304は、GETおよびHEADリクエストに対する応答でのみ返される必要があり、すべてのキャッシュ関連の応答ヘッダーが存在する必要があります。 )。

私はそれが役立つことを願っています;)

40
St.Woland

RFC 2616(HTTP 1.1) からの引用:

...「*」が指定され、そのリソースに現在のエンティティが存在する場合、リソースの変更日がIf-Modified-Sinceで指定された日付と一致しないため、必要な場合を除き、サーバーは要求されたメソッドを実行してはなりませんリクエストのヘッダーフィールド。

RFCでは、リクエストを実行する代わりに、サーバーはGETおよびHEADリクエストに対して304(変更なし)で応答し、すべてに対して412(前提条件が失敗した)で応答する必要があると述べています。他の要求タイプですが、それはサーバーが要求されたリソースのバージョンを実際に持っている場合のみです。エンティティがない場合は、shouldハンドルリクエスト(おそらく何も持っていないので404で)。

要求を処理するには、最初にそのヘッダーwere n'tが存在する場合にサーバーが何をするかを把握します。そのリクエストの結果がnot2xxまたは304の場合、通常どおりリクエストを処理します。ただし、リクエストの結果wouldが2xxまたは304の場合、If-None-Modifiedのケースを処理します。星の場合は、ただちに304を返します(If-Modified-Sinceに勝てない限り)。 1つ以上のエンティティタグである場合、それらのタグのいずれかが、応答として提供することを計画していたもののタグと一致するかどうかを確認します。一致するものがある場合、304を返します。一致するものがない場合は、通常どおりに提供します。

RFCの後半には、さらに次のようなものがあります。

「If-None-Match:*」の意味は、Originサーバー(またはキャッシュ、おそらくVaryメカニズムを使用して、セクション 14.44 を参照)によって選択された表現の場合、メソッドを実行してはならないことです。 )が存在し、表現が存在しない場合は実行する必要があります。この機能は、PUT操作間の競合を防ぐのに役立つことを目的としています。

つまり、スターは、クライアントに「anyバージョンのファイルが既に存在する場合、このファイルをPUTしないでください」と言うことを許可します。

11
Rob Kennedy