質問

調べてみましたが、ETag を両方使用する必要があるかどうかわかりませんでした そして Expires ヘッダー または どちらか一方。

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

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

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

役に立ちましたか?

解決

彼らは、わずかに異なっている - のETagは、クライアントが、将来的に再びそのファイルの要求を行うかどうかを判断するために使用できる任意の情報を持っていません。 ETagのは、それが持っているすべてである場合、それは常にリクエストを行う必要があります。サーバがクライアント要求からのETagを読み取る場合しかし、その後、サーバーは、ファイル(HTTP 200)を送信したり、単に自分のローカルコピー(HTTP 304)を使用するようにクライアントに指示するかどうかを判断することができます。 ETagのは、基本的には、ファイルの内容が変化する意味的に変更したファイルのためだけのチェックサムです。

ザ・ヘッダは、それがあっても、すべてのサーバに対して要求を行う必要があるか否かを決定するためにクライアント(およびプロキシ/キャッシュ)によって使用される有効期限。近いあなたがある日、それはクライアント(またはプロキシ)である可能性が高いが、サーバからそのファイルのHTTPリクエストを行います。

有効期限 どのくらいの頻度内容の変化に基づいて適切な値にExpiresヘッダを設定する -

は、だから、本当に何がやりたいことは両方のヘッダを使用しています。そして、クライアントがサーバに要求を送信行うと、それはより簡単に戻ってファイルを送信するかどうかを判断できるように送信されるようにてETagを設定ます。

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

他のヒント

のEtag 最終更新のヘッダがあるのバリデータの。

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

の有効期限のCache-Control ののの情報を更新与えている。

このは、イン間のプロキシに何時までか、どのくらいの時間のために、彼らは彼らのキャッシュにあるページ/ファイルを保つことが、彼らは、ブラウザと逆に通知することを意味します。

問題は、通常どちらのバリデータを使用するために、のETagまたは最終更新され、かつ使用するINFOMATIONヘッダを更新、期限切れになるか、またはキャッシュ制御できる。

Expires そして Cache-Control 「強力なキャッシュヘッダー」です

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

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

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

デフォルトでは、Apacheはに基づいてrel="noreferrer">完全に問題ないはずですが、ファイルのiノード番号、最終更新日時、およびサイズは、あなたがやりたいです。私はそれはまた、あなたがやりたいこともまったく問題あり、ディスク上のファイルの最終更新時刻に基づいて、デフォルトでのLast-Modifiedヘッダを生成すると思います。

あなたはおそらくもApacheは<のhref = "http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21に応じて(将来的には1年間の日付Expiresヘッダを送信している必要があります「REL =」noreferrer "> http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.21 の)ように、ブラウザはコンテンツがキャッシュ可能である知っています。それを設定するには、 mod_expiresをのを見てます。

別の要約:

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

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

  • 有効期限が切れます 有効期限を遠い将来に設定したが、ファイルの 1 つ (たとえば JS ファイル) をすぐに変更したい場合、一部のユーザーは長い間変更されたバージョンを入手できない可能性があるため、使用には注意が必要です。

私は答えの一部が見逃している可能性があることに言及したいと思います1つの追加の事はあなたのヘッダーにETagsExpires/Cache-controlの両方を有するの欠点です。

あなたのニーズに応じて、それはちょうどより多くのTCPのオーバーヘッドを意味するパケットを増加させる可能性がある、あなたのヘッダーに余分なバイトを追加することができます。あなたのヘッダーに両方のものを持つのオーバーヘッドが必要な場合は、再度、あなたが見るべきか、それだけでパフォーマンスが低下し、あなたのリクエストに余分な重量を追加します。

あなたはカイル・シンプソンによって、この優れたブログの記事でそれについての詳細を読むことができます: http://calendar.perfplanet.com/2010/bloated-request-response-headers/する

私のデータが古くなるだろうというときにEtagと、サーバは「クライアントの各要求をETagの値をチェックするだろうが、

私の見解では、期限切れのヘッダーでは、サーバーは、クライアントに伝えることができます。

のETagは、リソースがコピーいずれかを使用するかどうかを決定するために使用されます。そして、のCache-Controlのようなヘッダーは、キャッシュ数十年前に、クライアントは、ローカルリソースを取得すべきであることをクライアントに伝えられたExpiresます。

それはExpiresヘッダを使うようにするとよいでしょうように、

現代のサイトでは、多くの場合、app.98a3cf23.jsのように、ハッシュという名前のファイルが提供されています。このほかに、それはまた、ネットワークのコストを削減します。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top