2007年11月18日日曜日

PHPでブラウザキャッシュを有効にする

IE6ではCache-Controlが優先される。Cache-Controlがある場合、Pragma、Expiresは無視される。
FirefoxではExpiresとPragmaが優先され、両方無ければCache-Controlが適用される。
→ ExpiresとPragma無しでCache-Controlの設定をすればほとんどのブラウザに対応できる。(IE7は?)

PHPでCache-Controlを設定する方法。
※header()より先に他の出力をしてはいけない。

$strDate = 'tomorrow'; //翌日の0時までキャッシュさせる場合
$dt = new DateTime($strDate);
header('Cache-Control: max-age=' . ($dt->format('U') - time()));

PHPではSESSIONを使うと過去日付のExpiresと"Pragma: no-cache"が設定され、クライアントキャッシュが無効になる。
Firefoxの場合ExpiresとPragmaが優先されてしまうので、PHPでSESSIONを使い、かつクライアントキャッシュを有効にするには、未来日付のExpiresと適当なPragmaでhttpヘッダーを上書きする。(Pragmaには"no-cache"以外の設定値は無い)
$strDate = '+2 days'; //現在日時から2日後までキャッシュさせる場合
$dt = new DateTime($strDate);
header('Cache-Control: max-age=' . ($dt->format('U') - time()));
if (session_id()) { //session_startしている場合
 header('Expires: ' . $dt->format(DATE_RFC1123));
 header('Pragma: cache'); //no-cache以外の文字列をセット(横暴?)
}


参考:
 OZACC.blog: HTTPヘッダでのキャッシュ制御 2
 [Studying HTTP] HTTP Header Fields
 PHP: header - Manual
 PHP: 日付・時刻関数 - Manual
 PHP: セッション処理関数(session) - Manual

0 件のコメント:

ブログ アーカイブ

tags