web-dev-qa-db-ja.com

ETagとヘッダーの有効期限

私は周りを見回しましたが、ETag and Expires Header or oneまたはotherの両方を使用する必要があるかどうかを理解できませんでした。

私がやろうとしているのは、フラッシュファイル(および他の画像、およびそれらのファイルに変更があった場合にのみ更新されるもの)を確認することです。

キャッシュされないように、ファイル名を変更したり、URLの最後に奇妙な文字を追加したりするような特別なことはしたくありません。

また、これをサポートするためにPHPスクリプトでプログラム的にやらなければならないことはありますか、それともすべてApacheですか?

351
GeoffreyF67

それらは少し異なります-ETagには、クライアントが将来そのファイルに対して再度リクエストを行うかどうかを判断するために使用できる情報がありません。 ETagがすべての場合、リクエストを常に行う必要があります。ただし、サーバーがクライアント要求からETagを読み取ると、サーバーはファイルを送信する(HTTP 200)か、ローカルコピーを使用するようにクライアントに指示する(HTTP 304)かを決定できます。 ETagは基本的にファイルのチェックサムであり、ファイルのコンテンツが変更されると意味的に変更されます。

Expiresヘッダーは、クライアント(およびプロキシ/キャッシュ)によって使用され、サーバーへの要求を行う必要があるかどうかを判断します。有効期限に近づくほど、クライアント(またはプロキシ)がサーバーからそのファイルのHTTP要求を行う可能性が高くなります。

本当にしたいのは両方のヘッダーを使用することです。コンテンツが変更される頻度に基づいて、Expiresヘッダーを適切な値に設定します。次に、クライアントがサーバーにリクエストを送信するときに、ファイルを返送するかどうかをより簡単に判断できるように、ETagを送信するように構成します。

ETagに関する最後の注意点-Apacheを実行している複数のマシンで負荷分散されたサーバーセットアップを使用している場合は、おそらくETag生成をオフにすることをお勧めします。これは、inodeがサーバー間で異なるETagハッシュアルゴリズムの一部として使用されるためです。計算の一部としてiノードを使用しないようにApacheを構成できますが、すべてのサーバーに対して同じETagが生成されるように、ファイルのタイムスタンプが正確に同じであることを確認する必要があります。

663
Marc Novakowski

EtagおよびLast-modifiedヘッダーはバリデーター

これらは、同じ名前を保持している場合でも、ファイルやページが変更されたかどうかをブラウザやキャッシュ(リバースプロキシ)が理解するのに役立ちます。

ExpiresおよびCache-controlを与えています情報を更新します

これは、ブラウザおよびその逆のプロキシ間で、いつまで、またはどのくらいの間、ページ/ファイルをキャッシュに保持できるかを通知することを意味します。

そのため、質問は通常、どのバリデーターを使用するか(etagまたはlast-modified)、どのリフレッシュ情報ヘッダーを使用するか、期限切れにするか、キャッシュ制御するかです。

104
john

ExpiresおよびCache-Controlは「強力なキャッシュヘッダー」です

Last-ModifiedおよびETagは「弱いキャッシングヘッダー」です

最初にブラウザはExpires/Cache-Controlをチェックして、サーバーにリクエストを行うかどうかを決定します

要求を行う必要がある場合は、HTTP要求でLast-Modified/ETagを送信します。ドキュメントのEtag値がそれと一致する場合、サーバーは200ではなく304コードを送信し、コンテンツは送信しません。ブラウザは、キャッシュからコンテンツをロードします。

30
hienbt88

デフォルトでは、ApacheはEtagを生成します に基づいて ファイルのinode番号、最終変更日、およびサイズは、あなたが望むことをするのに完全にうまくいくはずです。また、デフォルトでは、ディスク上のファイルの最終変更時間に基づいてLast-Modifiedヘッダーが生成されると思います。これは、必要な処理を行うのにまったく問題ありません。

また、おそらく、Apacheが1年先のExpiresヘッダーを送信する必要があります( http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 に従って)ブラウザがコンテンツがキャッシュ可能であることを知っているようにします。 mod_expires を見て設定してください。

19
David Z

別の要約:

両方を使用する必要があります。 ETagは「サーバー側」の情報です。有効期限は「クライアント側」のキャッシュです。

  • 負荷分散されたサーバーがある場合を除き、ETagsを使用します。それらは安全であり、あなたがあなたの側で何かを変更するたびにあなたのサーバーファイルの新しいバージョンを取得する必要があることをクライアントに知らせます。

  • Expiresは、有効期限を遠い将来に設定しているが、いずれかのファイル(たとえばJSファイル)をすぐに変更したい場合、一部のユーザーは変更されたバージョンを取得できないため、注意して使用する必要があります長い間!

13
Benjamin Piette

答えのいくつかが見逃しているかもしれないことをもう一つ言及したいと思いますが、ヘッダーにETagsExpires/Cache-controlの両方を含むことのマイナス面です。

必要に応じて、ヘッダーに余分なバイトを追加するだけで、パケットが増加する可能性があり、TCPオーバーヘッドが増加します。繰り返しますが、ヘッダーに両方の要素を含めるオーバーヘッドが必要かどうか、またはリクエストに余分な重みを追加するだけでパフォーマンスが低下するかどうかを確認する必要があります。

カイル・シンプソンによるこの素晴らしいブログ投稿でそれについてもっと読むことができます: http://calendar.perfplanet.com/2010/bloated-request-response-headers/

1
aneagoie

私の見解では、Expire Headerを使用すると、サーバーはデータが失効することをクライアントに通知できますが、Etagを使用すると、サーバーはクライアントの各リクエストのetag値をチェックします。

1
Sunny

ETagは、リソースがコピー1を使用する必要があるかどうかを判断するために使用されます。 Cache-ControlのようなExpiresヘッダーは、キャッシュの10年前にクライアントがローカルリソースをフェッチする必要があることをクライアントに伝えます。

最近のサイトでは、app.98a3cf23.jsのようなhashという名前のファイルがよく提供されているため、Expiresヘッダーを使用することをお勧めします。これに加えて、ネットワークのコストも削減します。

それが役に立てば幸い ;)

0
Jack Chen