ブラウザキャッシュをデフォルトで無効化しておいてほしい。†
- ページ: BugTrack
- 投稿者: MorphyWiki
- 優先順位: 普通
- 状態: 完了
- カテゴリー: その他
- 投稿日: 2003-07-04 (金) 22:24:22
- バージョン:
メッセージ†
CGI など 動的にページを表示するような場合は、 htmlヘッダ部分に(Skinファイルに)
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
を入れておいてブラウザのキャッシュを無効化しておかないと、
実際にページが書き換えられていても変更反映された画面表示
にならない場合が多いです。
現実に現在の PukiWiki-official では記事をポストしても左側の
サイドメニューは更新されないのです(もちろん、ポストした
ページ自体では更新される。その1つ前のキャッシュに入って
いるページを再び閲覧した時に全く更新が反映されないという
意味です)。
現在、 PukiWiki-official では各ページごとにリロードしていたり
しますが、スキンに「キャッシュの無効化」をデフォルトで
取り込んでもらうわけにはいきませんか?
- この現象は上記のスキンのmeta指定の問題ではなく、開発日記/2003-06-12のheader_lastmod()関連を修正以降で頻発する問題です。PukiWIki 1.3.5及び6月12日以前のPukiWIki 1.4 rc2では(皆無とは言いませんが)ほとんど発生しません。 -- reimy
- とりあえずPukiWiki-officialについてはスキンの先頭部分で下記の2行を追加して対処済み。 -- reimy
<?php if (!defined('DATA_DIR')) { exit; } ?>
+ <?php header('Cache-control: no-cache') ?>
+ <?php header('Pragma: no-cache') ?>
<?php header('Content-Type: text/html; charset=UTF-8') ?>
<?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?>
Content-Typeでapplication/xhtml+xmlではなくtext/htmlにしているのは、Internet Explorerなど一部のブラウザ対策のため。
- この方法では、プロキシーでキャッシュが有効になってしまっていたようです。meta http-equiv ならプロキシーでキャッシュしないことを確認しているのですが…… -- MorphyWiki
- HTTPヘッダでの指定と、META指定が違った場合、どうなるか、とか、ブラウザごとの実装状況とか、キャッシュ関係の詳しい情報ってどこかに無いですかね? HTTPヘッダや、METAに頼らない方法ってのも、一応あるのですが・・・。それから、まだ、この辺の関係のソースコードを確認していないのですが、単にキャッシュを無効化するのではなく、最終更新日時をちゃんと反映させようと思うと、ページ内でインクルードしている他のページ(MenuBar や calendar_viewer など)の更新日時も調べないといけないので、結構大変ですよね?でも、できることなら、少しでも無駄なネットワークトラフィックやサーバー負荷を抑える為には、単なるキャッシュ無効化よりも、最終更新日時を反映する方法(ページ内容に更新が無ければ、キャッシュから読む)の方が良いですよね。その辺の方針って、どうなっているんでしょうかね? -- 三浦克介
- PHPのheader()関数のマニュアル
- ↑このマニュアルによれば、多くのプロキシとクライアントでは、以下のコードにより強制的にキャッシュを無効にできます、と書かれている。
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // 日付が過去
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
// 常に修正されている
header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0
- HTTP/1.1 のキャッシュ関係の仕様書。まだ、良く読んでいないけど。
- PHP4.0.3以降では、session_cache_limiter() なる関数が導入されている。セッション機能を使うときに利用するものだが、うまく使えば、キャッシュのコントロールが楽にできるかも。
- HTTPのバージョンによって違うし、ブラウザの種類・バージョンによって違うし、プロクシによって違うし、状況は複雑なようです。その辺のことをまとめてあるページとかがあると、いいのですが。
- 少々邪道な方法ですが、こういった複雑な問題を回避して、なおかつ確実にブラウザのキャッシュをコントロールする方法もあります(多分、大丈夫だと思います。試していないので、断言はできませんが)。
- 考えてみたら、newプラグインやcounterプラグインなど、ページ内容が更新されていなくても表示を更新を行わなければならない所があるので、やはり、キャッシュ無効化しか手がないですかね? もしも、きっちりと対処するならば、各プラグインに最終更新日時を返す関数を実装し、ページ内で呼び出している全てのプラグインについて最終更新日時を取得し、それらのうちの最新の日時を Last-Modified ヘッダに指定するというくらいしか方法が思いつきません。それだけ苦労して実装したとしても、counterプラグイン等を使っているページでは、キャッシュヒット率はかなり低くなってしまうので、あまり効果が無いような・・・。 -- 三浦克介
- ちなみに、今現在でも、PukiWiki-official はプロキシーのキャッシュが効いています(ISP Asahi-net のプロキシーを使っています)が、ここ(開発サイト)ではプロキシーもブラウザーでもキャッシュは効いていません。設置サーバーの設定に依存しているんでしょうか? -- MorphyWiki
- 先ほど気がついたのですが、PukiWiki-official はプロキシーでもキュッシュが無効になったみたい(数時間前は効いていた)。何か新しい対策を施したのでしょうか? -- MorphyWiki