プロが教えるわが家の防犯対策術!

いつもお世話になっております。
PHP5.2.5
Firefox3.5.2

ブラウザのページキャッシュをPHPスクリプトにて抑制したいのですが、
PHPマニュアルに書かれていた方法ではダメでした。
その方法は以下の通り。
----------------
<?php
// 日付が過去
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// 常に修正されている
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");
?>
--------------------------

これではダメでしたので、
毎回、Firefoxの
「ツール」→「オプション」→「ネットワーク(タブ)」
→「今すぐ消去(ボタン)」

という方法で、キャッシュされてしまっているデータを消去して、
最新の状態(変更が反映されたかどうか)を確認しています。

毎回、キャッシュをブラウザ側で消すのは面倒なので、
できれば、PHPスクリプト側で、キャッシュを無効とするような設定に
したいと思っています。

PHPマニュアルの方法では無理だったのは、
私の使用しているブラウザに原因があると考えられますでしょうか?

ページキャッシュ抑制を、
できればファイル単位で行いたいと考えています。

どなたかアドバイスをお願いいたします。

A 回答 (3件)

答えにはなりませんが、それだけの理由なら


F5+Ctrlキーでキャッシュを使用しない強制更新になります。

また、なんらかの理由でレスポンスヘッダーを
利用できない場合メタタグを使った方法もあるようです。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。

>F5+Ctrlキーでキャッシュを使用しない強制更新

ブラウザにそんな機能があるとは、知りませんでした。
勉強になります。

ちなみに、キャッシュでの対応ではありませんが、
物理的にキャッシュされていないかのような振る舞いが期待できる方法としては、

http://oshiete1.goo.ne.jp/qa5232066.html?from=na …

のようなものがありますね。
方法としては有名なものなのでしょうけども。

この方法では、
同じ「乱数」が与えられることのないように、
同一乱数の発生する確率が極端に低くなるように設計する必要があります。
しかし、方法が方法だけに、完全無欠のキャッシュ抑止策ではありませんので、次善策という位置づけで今は利用しています。

>メタタグを使った方法もあるようです

これはHTMLを突破口に対処するという意味だと思いますが、
HTMLのmetaタグで対処することと、
PHPのheader()で対処することとは等価ではないのでしょうか?
つまり、
PHPのheader()では対処できなくても、
HTMLのmetaタグでなら対処できてしまうことがある、
ということが存在し得るのでしょうか?、という意味です。

これが起こり得るケースというのは、例えば、
PHPのheader()を利用したキャッシュ操作を、
サーバ側で規制している場合なのかな、なんて思いますが、
個人的にはかなりレアケースな気がしています。笑

と、ごちゃごちゃ言ってないで、
HTMLのmetaタグでキャッシュを抑制する方法を探して、
早く試しなさいよ、と突っ込まれそうですね。苦笑

以下、蛇足。
(JavaJavax2さんの自己紹介がちょっと気になっていたりします。笑
今回頂いた回答が、「回答を出し惜しんでヒントだけを答えたり」に該当するのか、興味津々であったりするわけです。)

お礼日時:2009/08/26 11:02

>この方法では、同じ「乱数」が与えられることのないように、


>同一乱数の発生する確率が極端に低くなるように設計する必要があります。
>しかし、方法が方法だけに、完全無欠のキャッシュ抑止策ではありませんので、
>次善策という位置づけで今は利用しています。

アルファベット52文字+数字10文字で62パターン62^10=839299365868340224
普通の利用なら10文字くらいの乱数を生成してやれば、十分な解決方法だと
思いますけどね。仮にキャッシュが効いてしまったからといってとって
食われるわけでもないので・・。医療系でも金融系でもないだろうし、
まあ、確かにスマートじゃないというかあまり気持ちのいい実装ではないと思いますけど。


>これはHTMLを突破口に対処するという意味だと思いますが、
>HTMLのmetaタグで対処することと、
>PHPのheader()で対処することとは等価ではないのでしょうか?
>つまり、
>PHPのheader()では対処できなくても、
>HTMLのmetaタグでなら対処できてしまうことがある、
>ということが存在し得るのでしょうか?、という意味です。

metaタグはあくまで、サーバー設定ファイルやphpが利用できないために
headerが操作できない時の話ですが、結局キャッシュを実際に使うか
使わないかというのはブラウザの実装によるかもしれませんね。

私はそこまで詳しくないのでどんな時にどのような挙動になるか
詳しくは分かりませんど。でもメジャーなブラウザなら大体は
どちらも問題なく処理してくれるはずだとは思いますけど・・
等価かどうかはブラウザの実装にもよって違うでしょうし、
私には分かりかねますね。

そもそもブラウザによってキャッシュファイルが作られたからと
いってブラウザがリクエストの時にそれを使っているかどうかは
よく調べてみないと分からないんじゃないでしょうか。


>これが起こり得るケースというのは、例えば、PHPのheader()を
>利用したキャッシュ操作を、サーバ側で規制している場合なのかな、
>なんて思いますが、個人的にはかなりレアケースな気がしています。笑
普通にお金を払って利用するようなサーバでは考えにくい設定でしょうね


>
>以下、蛇足。
>(JavaJavax2さんの自己紹介がちょっと気になっていたりします。笑
>今回頂いた回答が、「回答を出し惜しんでヒントだけを答えたり」に
>該当するのか、興味津々であったりするわけです。)

出し惜しみというか、

私の中ではキャッシュのコントロールはレスポンスヘッダーと
metaタグなんかで出来たはずっていう程度の知識しかないので
もし以上の回答をするなら後は調べたり、何が原因で機能しないのか
実験しながらって事になりますが、実験する程手間はかけてられないので
単に質問を読んで知ってた事を書いただけです。というかご質問の
ヘッダー出力部の記述もよく読んですらいないです。

自分が昔キャッシュ制御に関して調べた時にブログにまとめて
書いて置いた参考になりそうなページは張りませんでしたけど・・。


ん~。チェックするならちゃんとへっだ部に間違った記述をしていないか。
headerはきちんと先頭に出力されているか。(他の出力の後ではきちんと
動作しなかったと思いますので・・)実際にブラウザ以外のHTTPクライアントで
繋いでレスポンスヘッダーが正常に出力されているか。どうか辺りを確認
してみたらいいんじゃないでしょうかね。もし正常に出力されいるなら
そのヘッダをブラウザがどう解釈して動くかという事に依存すると思います。

何かもっと詳しい人が答えてくれるといいですね。
キャッシュのプロとかw
    • good
    • 0
この回答へのお礼

長い回答をありがとうございます。

>アルファベット52文字+数字10文字で62パターン62^10=839299365868340224

こちらは勉強になりました。

>まあ、確かにスマートじゃないというかあまり気持ちのいい実装ではないと思いますけど。

ですよね~。笑
ということで、

>キャッシュのプロとかw

をしばらく待ってみます。
キャッシュで一国一城の主になられたお方の登場を夢見て。


>自分が昔キャッシュ制御に関して調べた時にブログにまとめて
書いて置いた参考になりそうなページは張りませんでしたけど・・。

出し惜しみされました。(笑)

やはり、私の日頃の行いが悪いからでしょうか。
「お礼数」をせっせと上げているのですけれどもね…。

お礼日時:2009/08/26 20:54

散々調べてみましたが、解決に至りませんでしたが、


ソレっぽい情報としては、
・IE8であれば、それらヘッダでキャッシュが抑止されていて、戻るボタンを押しても更新される。
・古いバージョン(Firefox 3.0.12・・・だったかな?)ではIE8同様の挙動をする
・新しいバージョン(Firefox 3.5.2)では、キャッシュが残る

というところでした。
3.0.6の時に、Cache-Controlをしてもキャッシュが残る問題で、修正がされていたのに、また再発しているような気がします。
しかし、Firefoxのバグ報告システム(Bugzilla)を見ても、ソレらしき情報は見つかりませんでした(探し方が悪いのかもしれません。)

解決策は思いつきません・・・

この回答への補足

あれからちょっと調べてみましたが、

ブラウザ(バージョンの違いも含め)の中には、
完全にキャッシュを無効化できないものがあるらしいということと、
無効化できたとしても、ブラウザによって、設定方法に違いがありそう(?)ということもあり、
なんとなくですが、
「一筋縄では対処できない」ことのように思えてきました。

(参考:Internet Explorer 4.01 Service Pack 2 以前の Internet Explorer でキャッシュを完全に無効にする方法は存在しません。
というような内容の記事をネット上で拾いました。)

なので、
どのブラウザ、バージョン関係なく、
強制的にキャッシュをほぼ無効化できる方法として私が現在使用している
「URLに乱数パラメータを与える方法」で対処することに致します…。笑

何かの拍子に、もっと良い方法が見つかりましたら、
折を見て、お知らせ致します!
 

補足日時:2009/08/28 23:34
    • good
    • 0
この回答へのお礼

>散々調べてみましたが、解決に至りませんでしたが、

いつもありがとうございます。
何か私にできることがあれば、何でもおっしゃって下さい!笑

>・古いバージョン(Firefox 3.0.12・・・だったかな?)ではIE8同様の挙動をする

すごい角度からアドバイスを書いて頂きました。
早くもブラウザに話が及んでいるということは、
私の質問文にある、キャッシュを抑止するソースコード自体は
間違っていないということを前提にアドバイスして頂いたのだと思います。
(PHPマニュアルに書かれていることですから、誤植は考えにくいですよね。笑)

ブラウザの問題となると、
私のコーディングにおいて不便であることは言うまでもなく、
不特定多数のサイト訪問者においても同様の振る舞いをするわけですから、
いくらソースコードが正しいと言っても、
これをそのまま使うだけで済ますのでは、
キャッシュ対策は不完全ということになりますね。

では、どうするか、ということで、
乱数による擬似的なキャッシュ抑止策が登場するわけですが、
この他にも代替策があるといいんですけどね~。うむぅ。
ただ、乱数による方法は効果覿面で、ズバリ効きますので、
今のところ、気に入って使っています。
mt_rand()の処理に時間がかかるようだとイヤですが…。

>3.0.6の時に、Cache-Controlをしてもキャッシュが残る問題で、修正がされていたのに、また再発しているような気がします。
しかし、Firefoxのバグ報告システム(Bugzilla)を見ても、ソレらしき情報は見つかりませんでした

Firefoxについて、お詳しそうですね。笑
ちなみに、私はFirefoxをメインに使っています。
まだまだシェアは小さいようですが、
このブラウザより使いやすいものを私は知りません。
IEはやたら重いのでほとんど使っていません。

本問の解決策について、再度自分でも、
アレコレ探してみようかと思います。

何か分かりましたら、こちらよりご報告致します。

お礼日時:2009/08/27 01:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!