PHP+MySQLで、画像が投稿できる掲示板のようなものを製作しています。投稿内容の修正で、画像を再アップした時に、以前の画像がキャッシュに残ってしまい、再読込みしないと、画像が最新の物に変わりません。

キャッシュが残らないようにするには、どうしたら良いでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:ootatmt No.1

回答回数1307ベストアンサー獲得回数65

ポイント10pt

http://tech.bayashi.net/pdmemo/browsercache.html

ブラウザ のキャッシュを制御する/no-cache

HTTPヘッダーで次の出力をしておきます。


Pragma: no-cache

Cache-Control: no-cache

Expires: 0


詳しくはURLのページに書かれています。

id:magicshops No.2

回答回数3ベストアンサー獲得回数0

ポイント10pt

ヘッダーでキャッシュを無効にするという方法が紹介されています。

この方法を試してみてはいかがでしょうか?

id:ebagos

header(”Cache-Control: no-cache, must-revalidate”);

header(”Pragma: no-cache”);

上記を記載して、HTMLはキャッシュされないようになったのですが、画像はキャッシュされてしまいます・・・

2005/09/28 14:48:25
id:ootatmt No.3

回答回数1307ベストアンサー獲得回数65

ポイント17pt

http://www.hatena.ne.jp/1127867724

人力検索はてな - PHP+MySQLで、画像が投稿できる掲示板のようなものを製作しています。投稿内容の修正で、画像を再アップした時に、以前の画像がキャッシュに残ってしまい、再読込みしない..

画像のURLにランダムな文字を添付してはどうでしょうか。


HTMLはPHPで出力していると思いますが、その際に画像のアドレスにランダムな数字などをつけるようにします。


(例) <img src=”http://www.hatena.ne.jp/images/hatena_blue.gif#123”>


これで、キャッシュが残っても毎回違うアドレスになっていますので、編集後にキャッシュが表示されることはありません。

id:ebagos

URLにランダムな文字を添付してみましたが、キャッシュには、hatena_blue.gif(例)として登録されるようです。

2005/09/28 15:33:45
id:redcherry No.4

回答回数135ベストアンサー獲得回数0

ポイント33pt

URLはダミーです。


CGIはブラウザに画像へのURLを提示するだけであって、実際の画像ダウンロードはWebサーバとブラウザだけの仕事になります。

もう少し細かいことを言えば、imgタグやそこに挿入可能なJavaScriptで何らかのキャッシュコントロールが出来るとよかったのかもしれませんけれど、現実には(おそらく)その手段は用意されていません。


で、ブラウザ側はサーバに画像(に限りません。ファイル全般)を要求する際に最後の更新時刻とデータのハッシュコードを送信して、その日付よりも新しい、もしくはハッシュコードが異なる場合には画像のデータを送り返し、そうでない場合は「更新されてないよ」という返事を返すだけにとどまります。


サーバに新しいファイルが存在するはずなのにその情報が正しくクライアントに伝わっていないのか、それともクライアントがいい加減な問いかけをサーバにしてしまっているために「更新なし」と返事してしまっているのかは実際にやりとりされているHTTPメッセージを解析して調べてみる必要があると思いますが、大抵はサーバの設定(もしくはバージョン)に問題があるためにサーバがクライアントに正しい情報を返していない場合が多いと思います。

この場合の「サーバ」はWebサーバに限りません。

実はサーバのトラフィックをおさえるために、Webサーバの直前にProxyサーバが設置してある場合もあり、そちらの設定がまずいのかもしれません。


従って、単にPHPやWebサーバ側をどうにかすれば・・・という問題でもないわけです。


余談ですが、仮に画像のキャッシングを無効化する事が可能だったとしても、あんまりいいソリューションじゃないですよね。

更新されていようがいまいが必ず画像のデータが飛び交うわけですから、サーバに優しくありません。


そこで、ちょっとひねった解決策があります。


画像を更新保存する際に、実際のファイル名の末尾に(ただし拡張子の前に)更新毎に新しく発行する文字列を追加する、という方法です。

これは画像URL末尾に#fooなどのラベルを設置する方法では解決しません。

キャッシングの対象は実体URLのみですから、その内部の位置を意味する#fooは効果がないのです。


その解決策の流れはこうです。


ファイル名が hoge.jpg であるならば、初めてサーバにアップロードされた時にはサーバ上での保存名を hoge_0.jpg

この画像が更新保存されたら hoge_1.jpg としてサーバには保存し、かつて保存してあった hoge_0.jpg を削除する

また画像が更新保存されたら hoge_2.jpg としてサーバには保存し、かつて保存してあった hoge_1.jpg を削除する


こうすれば問題は解決するのではないでしょうか?

CGIからブラウザに提示される画像URLは画像が更新されるたびに変化するわけですから、キャッシュの問題は回避されます。


実は、この手段はあちこちの画像掲示板でも採用されている模様です。

やっぱり必ずぶつかる問題のようですね。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません