ブラウザのキャッシュ ポリシーは、閲覧したファイルをローカル ディスクに一時的にキャッシュします。ユーザーが繰り返しページをリクエストすると、ページが変更されていないことがクライアントに通知され、キャッシュを呼び出すことができます。 では、クライアントにページ キャッシュがあるかどうかはどうすればわかるのでしょうか? HTTP プロトコル レベルから見ると、ブラウザがリクエストを送信すると、まず次の
HTTP ヘッダーが送信されます:
Connection Keep-Alive
Date Sun, 06 May 2012 18:00:36 GMT
Last-Modified Sun, 06 May 2012 17: 31:02 GMT
Etag ec1f629013925ab0fa4389ba926e8c06
Keep-Alive timeout=15, max=299
Server Apache/2.2.16 (Unix) DAV/2
Vary Accept-Encoding
次の 2 行に注意してください。ページキャッシュ情報:
Last-Modified Sun, 06 May 2012 17:31:02 GMT
Etag ec1f629013925ab0fa4389ba926e8c06 この場合、サーバーが 304 ステータス コードで応答すると、ブラウザは応答すると意識的にキャッシュからデータを読み取ります。ステータス コード 200 の場合、クライアント キャッシュがあるかどうかに関係なく、サーバーから読み取られます。
この理論的裏付けによれば、たとえば、ウェブマスター軍のクエリ結果のほとんどは、ajax を介して非同期的に取得され、二次アクセスのためにこの方法でキャッシュを変更できます。クライアントにキャッシュがある限り、304 応答ステータス コードをクライアントに送信し、プログラムの実行を終了します。
ブラウザによって送信されたリクエストには、If-Modified-Since と If-None-Match の 2 つのパラメータが含まれています。
If-Modified-Since は、データの最終変更時刻が特定の時刻値であるかどうかを尋ねることを意味します。次に、サーバーはデータの最終変更時刻を確認し、その時刻である場合は 304 ステータス コードを返します。ステータス コードを受信した後、クライアントはローカル キャッシュからキャッシュを直接読み取ります。この状況には前提条件があります。つまり、ブラウザーが If-Modified-Since パラメーターを送信する前にキャッシュ リソースがローカルに存在する必要があり、その値は最後のサーバーから返された Last-Modified 値です。
If-None-Match はサーバーから返された Etag 値によって生成され、サーバーによってデータの変更時間を確認するためにのみ使用されます。 If-Modified-Since と Last-Modified を組み合わせた方法はすべてのサーバーでサポートされているわけではないことを考慮して、ここでは etag を使用した実装のみを検討します。
PHP では、$_SERVER['HTTP_IF_NONE_MATCH'] を使用して、ファイルがブラウザーによってキャッシュされているかどうかを判断できます。コード スニペットは次のとおりです:
//etag タグを使用してキャッシュを制御します
コードは次のとおりです | コードをコピーします |
$etag = md5(date('Ymd')); if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag) { header('Etag:' . $ etag, true, 304); exit(); } else { header('Etag:' . $etag); |
}ここでは、現在の日付を使用して etag を生成します。このパラメータは必要に応じて変更できます。
追加の説明:
それが 304 応答であっても、データを送信する必要があるかどうかを判断するために接続を確立する必要があるため、実際にはサーバーに要求されます。
もう 1 つ。キャッシュのタイプは 200 応答です。キャッシュは接続を確立しませんが、要求は 200 ステータス コードで応答し、ローカルからキャッシュを直接読み取ります。