web-dev-qa-db-ja.com

ブラウザに画像の更新/ダウンロードを強制する方法はありますか?

画像がアップロードされておらず、古い画像がまだ存在しているとユーザーが報告するという問題があります。よく見ると、新しいイメージがあり、古いイメージと同じ名前が付いています。アップロードで行うことは、SEOの目的で画像の名前を変更することです。画像を削除すると、古いインデックスが使用可能になり、再利用されます。したがって、同じイメージ名を持ちます。

ブラウザにそのキャッシュを使用しないように指示する方法はありますか?

より良い答えは、イメージの名前をまったく新しいものに変更することです。私はそれに取り組みますが、当面は大きな問題に取り組む間、迅速な解決策になります。

39
uriDium

任意の一意の番号(または時間、バージョン番号など)をクエリ文字列に追加します。

<img src="image.png?80172489074" alt="a cool image" />

URLが異なるため、これにより新しいリクエストが発生します。

115
knittl

硬いです。本当に画像をキャッシュしたいのですが、新しい画像が利用可能になったらキャッシュしたくありません:

  • 過去の日付でexpiresヘッダーを使用すると、キャッシュが防止されます。悪い
  • 「キャッシュ無効化」パラメーター?342038402を追加すると、問題を修正できますが、イメージがキャッシュされないようにすることもできますが、これは望ましくありません。悪い。
  • Expiresヘッダーを短い(1時間とする)expiresを使用すると、より良い... 1時間後にユーザーに画像が表示されますが、Webサーバーは毎回画像を提供する必要はありません。妥協しますが、何時に機能しますか?現実的ではありません。

ソリューション?次の2つのオプションを考えることができます。

  • ETags、およびそれらを使用する能力を調べてください。これらは、このような状況向けに設計されています。ブラウザは、ファイルが最新かどうかをサーバーに明示的に尋ねます。 Apacheでこれを有効にすることができます。
  • 新しい画像ごとに新しいURLを作成します(そして、将来のexpiresヘッダーを使用します)。これはあなたが取り組んでいるものです。
21
ndp

現在の日時を画像srcに追加します。

<img src="yourImage.png?v=<?php echo Date("Y.m.d.G.i.s")?>" />
4
Rob Vanders

http-equiv in <meta>タグは、ブラウザにキャッシュを使用しないように指示します(または、さらに適切な方法でキャッシュを使用します)が、適切なhttp cacheヘッダーを送信するようにサーバーを構成することをお勧めします。 キャッシュに関する記事 をご覧ください。

それでも、一部のブラウザはhttp標準のすべてをサポートしていないかもしれませんが、私はそれが進むべき道だと信じています。

4
samuil

in PHPこのトリックを使用できます

<img src="image.png?<?php echo time(); ?>" />

Time()関数は、現在のタイムスタンプを表示します。すべてのページの読み込みは異なります。そのため、このコードはブラウザを欺きます。別のパスを読み取り、ユーザーが前回サイトにアクセスしたために画像が変更されたと「考え」ます。また、キャッシュを使用する代わりに、再ダウンロードする必要があります。

2

ランダムに行きます。乱数を使用して、画像ファイル名を追加するだけです。

<img src="image.jpg?<?=Rand(1,1000000)?>">
2
Girish Pandey

hTTPヘッダーを使用してキャッシュの動作を制御できます。

過去にexpiresヘッダーを設定すると、ブラウザはキャッシュバージョンを使用しなくなります。

Expires: Sat, 26 Jul 1997 05:00:00 GMT

[〜#〜] rfc [〜#〜] で詳細を確認できます。

2
RageZ

私のお気に入りのソリューションPHP:

<img src="<?php echo "image.jpg" . "?v=" . filemtime("image.jpg"); ?>" />

ファイルを変更するたびに、ファイルの新しいバージョンが「作成」されます

1

ブラウザーとサーバー間で交換されるデータを見ると、ブラウザーがHTTP HEAD画像のリクエストを送信していることがわかります。結果には変更時間(実際の画像データではありません)。サーバー上で画像が変更され、ブラウザが再度画像をダウンロードする必要がある場合は、この時間が変更されることを確認してください。

1
Aaron Digulla

PHPでは、乱数または現在のタイムスタンプを送信できます。

<img src="image.jpg?<?=Date('U')?>">

または

<img src="image.jpg?<?=Rand(1,32000)?>">
1
Arvy