[PHP-users 3055] Re: phpでのキャッシュの有効期限について
Yasuo Ohgaki
php-users@php.gr.jp
Wed, 24 Oct 2001 10:21:52 +0900
大垣です。
IE6をインストールしたら、ドキュメントの有効期限の取り扱いが多少変
わった様なので、ちょうどいろいろ試していました。
# IE6の動作に関する技術情報で良いURLがある場合は教えてください。
hasegawa wrote:
> はじめまして、長谷川と申します。
>
> 基本的なところなのかもしれませんが、切り分けがうまくできず
> 悩んでいます。
> 判る範囲で構いませんので、アドバイスをお願いします。
>
> ■環境
> ●サーバ
> Linux (Miracle Linux STD 1.0)
> Apache 1.3.19
> PHP 4.0.6
> ●クライアント
> Windows98SE
> InternetExplorer 5.0
> NetScape 4.75
>
> ■現象説明
>
> ラジオボタン、プルダウンメニューが入ったページを作成している
> がform画面のプルダウンなどの色々な値を変更させてリサイズ
> キャッシュの制御に<META>タグの設定は行なわず、ブラウザのデフ
> ォルト(セッション毎)で確認
私も、METAで色々設定するのはちょっと難ありと思います。本来のHTTP
Headerで調整すべき事なので。(両方使ったりしていますが、、)
>
> ●Netscape4.75の現象
> ・変更させた値が、全て初期の状態に戻る。
> ・「ページ情報の表示」の有効期限:11/19/81 17:52:00と過去
> ●InternetExplorer5.0では
> ・ 問題なく、選択状態のまま表示される。
> ・「ページ情報の表示」の有効期限:「日付けなし」
>
> 上記は、PHPでHTMLを出力しないで、htmlファイルとして読みこんだ
> 場合には、有効期限が「日付なし」になり、リサイズしても変更させた
> 値を覚えている。
PHP4 Sessionを利用している前提で返信します。
session.cのソース(4.1.0RC CVS)ですが、以下の部分でヘッダーを生成し
ています。public以外の場合は過去の日付のExpiresヘッダーを送信します。
# この手の問題はヘッダーも簡単にみれる、wget, curl等を利用
# した方が簡単です。
CACHE_LIMITER_FUNC(public)
{
char buf[MAX_STR + 1];
time_t now;
time(&now);
now += PS(cache_expire) * 60;
#define EXPIRES "Expires: "
memcpy(buf, EXPIRES, sizeof(EXPIRES) - 1);
strcpy_gmt(buf + sizeof(EXPIRES) - 1, &now);
ADD_COOKIE(buf);
sprintf(buf, "Cache-Control: public, max-age=%ld", PS(cache_expire)
* 60);
ADD_COOKIE(buf);
last_modified(TSRMLS_C);
}
CACHE_LIMITER_FUNC(private)
{
char buf[MAX_STR + 1];
ADD_COOKIE("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
sprintf(buf, "Cache-Control: private, max-age=%ld, pre-check=%ld",
PS(cache_expire) * 60, PS(cache_expire) * 60);
ADD_COOKIE(buf);
last_modified(TSRMLS_C);
}
CACHE_LIMITER_FUNC(nocache)
{
ADD_COOKIE("Expires: Thu, 19 Nov 1981 08:52:00 GMT");
/* For HTTP/1.1 conforming clients and the rest (MSIE 5) */
ADD_COOKIE("Cache-Control: no-store, no-cache, must-revalidate,
post-check=0, pre-check=0");
/* For HTTP/1.0 conforming clients */
ADD_COOKIE("Pragma: no-cache");
}
>
> ■質問事項
>
> ・PHPで作成したページをhtml形式のように有効期限「日付なし」にする事
> 可能でしょうか?
「日付なし」にできないか?と言うことでしょうか? (NN 4.7のページ情報
ですよね?) Expiresヘッダーを送らなければ、日付無しになると思います。
Expiresヘッダーの問題であれば、session_cache_limitter()を読んだ後
に、Expiresヘッダーを送り直せば、新しいExpiresヘッダーのみ送ってく
れます。
Expiresヘッダーを完全に消すためにはcache limitterに"none"等の無効
な値をいれておくとヘッダーを送りません。cache limitterも使う場合
は、session_cache_limitter()を読んだ後、各ヘッダーを上書きするとよ
いです。
# sessionモジュールでヘッダーを送ったかどうか状態を管理
# しているので、cache limtterが呼ばれてから、ヘッダーを
# 変更しないと上書きされます。
RFC2616(とHTTP1.0等の古いRFCも)を読んでみてはどうでしょうか?
> ・または、HTMLのようにリサイズしても変更した値を覚えているようにする
> 事は可能でしょうか?
JavaScriptでリロードした場合は普通の状態ではフォームのデータは消え
てしまいます。リサイズしてフォームデータがリセットされるのはブラウ
ザがリロードしているのでは無いか、と推測します。(古いNNにはリサイ
ズ時の問題があったので、対 処策?)
持ち回すことは可能です。データ量が少ないようであれば、Query String
でデータを持ち回すとクライアントのみで完結します。サーバーに
POST/GETでフォームのデータを送って、再表示と言う方法の方が無難かも
しれません。
--
Yasuo Ohgaki
yohgaki@dd.iij4u.or.jp
__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo! http://bb.yahoo.co.jp/