キャッシュが残らないようにするには、どうしたら良いでしょうか?
http://tech.bayashi.net/pdmemo/browsercache.html
ブラウザ のキャッシュを制御する/no-cache
HTTPヘッダーで次の出力をしておきます。
Pragma: no-cache
Cache-Control: no-cache
Expires: 0
詳しくはURLのページに書かれています。
http://pukiwiki.sourceforge.jp/dev/?BugTrack%2F486
BugTrack/486 - PukiWiki-dev
ヘッダーでキャッシュを無効にするという方法が紹介されています。
この方法を試してみてはいかがでしょうか?
http://www.hatena.ne.jp/1127867724
人力検索はてな - PHP+MySQLで、画像が投稿できる掲示板のようなものを製作しています。投稿内容の修正で、画像を再アップした時に、以前の画像がキャッシュに残ってしまい、再読込みしない..
画像のURLにランダムな文字を添付してはどうでしょうか。
HTMLはPHPで出力していると思いますが、その際に画像のアドレスにランダムな数字などをつけるようにします。
(例) <img src=”http://www.hatena.ne.jp/images/hatena_blue.gif#123”>
これで、キャッシュが残っても毎回違うアドレスになっていますので、編集後にキャッシュが表示されることはありません。
URLにランダムな文字を添付してみましたが、キャッシュには、hatena_blue.gif(例)として登録されるようです。
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は画像が更新されるたびに変化するわけですから、キャッシュの問題は回避されます。
実は、この手段はあちこちの画像掲示板でも採用されている模様です。
やっぱり必ずぶつかる問題のようですね。
header(”Cache-Control: no-cache, must-revalidate”);
header(”Pragma: no-cache”);
上記を記載して、HTMLはキャッシュされないようになったのですが、画像はキャッシュされてしまいます・・・