15

Apache のmod_expiresモジュールには、 accessModificationExpiresという 2 つの基本期間を持つディレクティブがあります。

ExpiresByType text/html "access plus 30 days"

当然のことながら、キャッシュは 30 日後に新しいコンテンツを要求します。

でも、

ExpiresByType text/html "modification plus 2 hours"

直感的にわかりません。

ブラウザのキャッシュは、サーバーにリクエストを送信しない限り、ファイルが変更されたことをどのように認識しますか? また、サーバーを呼び出している場合、このディレクティブをキャッシュすることの用途は何ですか? キャッシングの重要な部分を理解していないようです。教えてください。

4

4 に答える 4

41

Expires*「変更」をベースとするディレクティブは、サーバー上のファイルの変更時刻を参照します。したがって、たとえば「変更に 2 時間」を設定すると、(サーバー上で) ファイルが変更されてから 2 時間以内にコンテンツを要求するブラウザーは、ファイルの変更時刻から 2 時間後までそのコンテンツをキャッシュします。Expiresまた、サーバーが適切な有効期限を含むヘッダーを送信するため、ブラウザーはその時間がいつであるかを認識しています。

例を挙げて説明しましょう: Apache 構成に次の行が含まれているとします。

ExpiresDefault modification plus 2 hours

index.htmlサーバー上に、ExpiresDefaultディレクティブが適用されるファイルがあります。9:53 GMT にのバージョンをアップロードしindex.html、以前の既存のものを上書きするとしますindex.html(存在する場合)。の変更時刻index.htmlは 9:53 GMT です。ls -lサーバー (またはdirWindows) で実行している場合は、リストに表示されます。

-rw-r--r--  1 apache apache    4096  Feb 18 09:53 index.html

現在、すべてのリクエストで、ApacheLast-Modifiedはファイルの最終変更時刻を含むヘッダーを送信します。そのディレクティブがあるため、ファイルの変更時間 (9:53) に 2 時間を加えた時間でヘッダーExpiresDefaultも送信されます。Expiresブラウザに表示される内容の一部を以下に示します。

Last-Modified: Wed, 18 Feb 2009 09:53:00 GMT
Expires: Wed, 18 Feb 2009 11:53:00 GMT

ブラウザがこのリクエストを行った時刻が 11:53 GMT より前である場合、ブラウザはページをキャッシュします。これは、まだ有効期限が切れていないためです。したがって、ユーザーが最初に 11:00 GMT にページにアクセスし、次に 11:30 GMT に同じページに再度アクセスした場合、ブラウザーはキャッシュされたバージョンがまだ有効であることを認識し、そうしない (というより、そうしないことが許可されている) ) 新しい HTTP リクエストを作成します。

ユーザーが 12:00 GMT に 3 回目のページにアクセスすると、ブラウザーはキャッシュされたバージョンの有効期限が切れていることを認識し (11:53 以降)、ページの検証を試み、If を使用してサーバーに要求を送信します。 -Modified-Since ヘッダー。ページの日付は最初に提供されてから変更されていないため、本文のない 304 (not modified) 応答が返されます。有効期限が過ぎているため (ページが「古い」ため)、検証が失敗するまで、ページにアクセスするたびに検証要求が行われます。

では、11:57 に新しいバージョンのページをアップロードしたとしましょう。この場合、ブラウザーは 12:00 に古いバージョンのページを検証しようとして失敗し、応答で新しいページと共に次の 2 つの新しいヘッダーを受け取ります。

Last-Modified: Wed, 18 Feb 2009 11:57:00 GMT
Expires: Wed, 18 Feb 2009 13:57:00 GMT

(ファイルの最終変更時刻は、新しいバージョンのアップロード時に 11:57 になり、Apache は有効期限を 11:57 + 2:00 = 13:57 GMT として計算します。)

検証 (最新の日付を使用) は、13:57 までは必要ありません。

(もちろん、上記の 2 つのヘッダーと一緒に他の多くのものが送信されることに注意してください。簡単にするために、残りのすべてを削除しました)

于 2009-02-18T21:50:54.273 に答える
0

私の理解では、変更により、Last-Modificatied HTTP ヘッダーの値に基づいてキャッシュ時間をベースにするようブラウザーに要求されます。したがって、変更に 2 時間を加えたものが、最終変更時間に 2 時間を加えたものになります。

于 2009-02-18T21:00:58.730 に答える