ETagとヘッダーの有効期限


359

私は周りを見回しましたが、ETag Expiresヘッダーの両方を使用する必要があるのか、どちらか一方を使用する必要があるのか​​わかりません。

私がやろうとしていることは、フラッシュファイル(および他のイメージ)と、それらのファイルに変更があったときに更新されるだけではないことを確認することです。

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

また、これをサポートするために私のPHPスクリプトでプログラム的に行う必要があることはありますか、それともすべてApacheですか?


回答:


677

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

Expiresヘッダーは、クライアント(およびプロキシ/キャッシュ)がサーバーにリクエストを送信する必要があるかどうかを判断するために使用されます。Expiresの日付に近いほど、クライアント(またはプロキシ)がサーバーからそのファイルに対してHTTPリクエストを行う可能性が高くなります。

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

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


12
Expiresの代わりにCache-Controlを使用する必要があるかどうかも確認する必要があります。私の理解では、Cache-ControlはExpiresの後に導入され、より多くの制御を提供します。stackoverflow.com/questions/5799906/…を
Luis Perez

6
Expiresヘッダーを使用する場合、リソースが変更されるたびにファイル名を変更することをお勧めします。これは、クライアントが古い状態になる前にファイルを再度要求しないためです。特に、有効期限として遠い将来の値を使用している場合。
schnatterer 2014

8
両方を使用するとします。有効期限が切れてもファイルは変更されない場合(Etagは同じ)、どうなりますか?サーバーは304を返し、ファイルはブラウザのキャッシュから提供されます。私の質問は、現時点で有効期限が再生成されますか?
user345602

2
ETAG Expiresヘッダーをゼロ以外の値に設定するように注意してください。これにより、競合状態が発生する可能性があります。jakearchibald.com/2016/caching-best-practicesを
Weston

2
iノードまたはタイムスタンプをまったく使用しないようにサーバーに指示することは可能ですか?また、コンテンツのみを表すために使用されるのに、ETagにそれらが必要なのはなぜですか?
セザールカストロ

108

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

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

ExpiresCache-control更新情報を提供しています。

これは、ブラウザとプロキシの中間のリバースが、いつ、どのくらいの期間、ページ/ファイルをキャッシュに保持するかを通知することを意味します。

したがって、問題は通常、使用するバリデーター(etagまたはlast-modified)と、使用するリフレッシュ情報ヘッダー、有効期限、またはキャッシュ制御です。


31

ExpiresそしてCache-Control「強いキャッシングヘッダ」です

Last-ModifiedそしてETag「弱いキャッシングヘッダ」です

まずブラウザExpires/Cache-Controlがサーバーにリクエストを行うかどうかを確認します

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


1
「強力で弱い」キャッシュ動作をサポートするドキュメントはありますか?私はそれを見つけることができませんでした、そして私のクライアントブラウザは今や実際に有効期限よりも最後に変更されたものを優先します、それは私には理由がわかりません。
GMsoF 2015

1
@GMsoFこれを見てみたいかもしれません:tools.ietf.org/html/rfc7232#section-2.1
Medeiros

したがって、変更がすぐにクライアントに反映されるようにしたいが、それでも一部のキャッシュのメリットがある場合は、Last-ModifiedとETagしか使用できません。
Sebastien Lorber

これは最も簡潔ですが、私にとって最も明確な答えです!ありがとう。
aderchox

18

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

また、ブラウザがコンテンツであることをブラウザが認識できるように、Apacheに1年後のExpiresヘッダー(http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21による)を送信させることもできます。キャッシュ可能。それを設定するためにmod_expiresを見てください


したがって、ETagは最後に変更され、expiresヘッダーはそれをキャッシュしたいことを通知し、ファイルをアップロードして上書きすると、ユーザーのキャッシュに再度プルダウンされるだけで、そうでなければ304が正しく生成されますか?
GeoffreyF67

Etagは、最終更新日に複雑な方法で依存します。ただし、ファイルを変更すると、Etagが変更されます。次に、ブラウザによって送信されたEtag(ファイルのキャッシュバージョン用)はサーバー上のファイルのEtagと一致せず、Apacheは304応答ではなくファイルを送信します。
David Z、

6
1年の期限切れヘッダーは、クライアントに1年間新しいバージョンをチェックしないように指示しませんか?
John Bachir、2011年

@ジョン:ええ、私はそれを書いたときに決して変わらない静的コンテンツを考えていたと思います。
David Z

2
@John Bachir:それは期待どおりの動作になるはずですが、ブラウザは少なくとも新しいバージョンを問い合わせるためにサーバーにアクセスするようです。:私はこの問題について別の質問を開いたstackoverflow.com/questions/10048740/...
マルコDemaio

13

別の要約:

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

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

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


2
このExpiresの状況の場合、基本的にjsの名前を変更してHTMLで変更する必要があり、HTMLファイルの有効期限も1年に設定していないことを望みます。
EralpB

1

いくつかの回答が見落としている可能性があることをもう1つ述べておきますが、ヘッダーとヘッダーの両方ETagsを使用することのマイナス面Expires/Cache-controlです。

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

詳細については、Kyle Simpsonによるこの優れたブログ投稿をご覧ください。http//calendar.perfplanet.com/2010/bloated-request-response-headers/


1

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


0

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.