5

このようなリンクで画像を保存してキャッシュしています

http://example.com/1.jpg
http://example.com/2.jpg

1.jpgユーザーは、またはを変更および上書きすることができます2.jpg。だから私はすべての画像をキャッシュしたいのですが、上書きされたばかりのその画像ファイルのキャッシュを更新します。現在.htaccess、キャッシュにメソッドを使用しています

<IfModule mod_expires.c>
ExpiresActive On
<FilesMatch "(?i)^.*\.(jpg|jpeg|png)$">
ExpiresDefault "access plus 1 year"
</FilesMatch>
</IfModule> 

ただし、このメソッドを使用すると、ユーザーがファイルを上書きしても、イメージは同じままです。

4

2 に答える 2

5

今後、ETagはそれ以上の努力なしにあなたのニーズに応えるはずです。ETagはデフォルトで機能するため、実際には何もする必要はありませんが、複数サーバー環境での問題を回避するために、ファイルサイズと最終変更のタイムスタンプから計算されるようにETagを構成できます。たとえば、既存のディレクティブを、.htaccessまたはApache構成の次の行に置き換えます。

FileETag MTime Size

ETagは、画像が変更されたときに、キャッシュされた画像を効果的に自動的に「期限切れ」にします。欠点は、ブラウザがリクエストごとにリソースについて問い合わせを行うため、使用した有効期限ディレクティブよりも効率が少し低下することです。一方、ETagはあなたが説明した問題を回避します。

ただし、質問で説明されているようにキャッシュディレクティブのいずれかをすでに使用していて、Expires値を遠い将来に設定している場合、過去にファイルを要求したブラウザは、しばらくの間、ファイルを再度チェックしません。URLのような些細なクエリ文字列?cache=123をURLに追加して、それを異なるものにする(つまり、キャッシュをバイパスする)ことで、この問題を回避できます。そうすれば、将来的にETagメカニズムに頼ることができます。

于 2012-11-20T23:17:41.193 に答える
2

問題はサーバーではなくブラウザにある可能性があります。ブラウザは、画像の変更についてサーバーをチェックしません。あなたがしたことは、その問題に完全には対処していません。

以下は、サーバーに変更がないか常にチェックするようにブラウザに指示します。

<IfModule mod_headers.c>
  <FilesMatch "(?i)^.*\.(jpg|jpeg|png)$">
  Header set Cache-Control "max-age=0"
  </FilesMatch>
</IfModule>

これにより、これらの画像にアクセスするときにサイトの速度が低下することに注意してください。ファイルは引き続きキャッシュされますが、ブラウザはサーバーをチェックして、ファイルが変更されているかどうかを確認します(If-Modifed-Since)。max-age(秒単位)を増やして、古さを犠牲にしてパフォーマンスを向上させます。

(BTW、 "max-age = 0、must-revalidate"の方が適切な値ですが、ブラウザーが仕様を誤って実装しています。must-revalidateは、一部のブラウザーおよびプロキシでキャッシュを無効にする場合があります。)

https://stackoverflow.com/a/1383359/1205867も参照してください

于 2012-11-21T03:02:53.437 に答える