304関係のえらーあんどえらー

 最近新聞でコントラバスを5本盗んでお縄って事件が出てましたがそれを弾いた経験の有る自分が思うには良く盗んだなぁと。1本でも運ぶの大変なのに5本。2回に分けて運んだらしいですがそれでもトラックかバンを借りなきゃだめでしょう1。痛んで無ければいいんですが…。闇に流すとしたってデカイわ嵩張るわ足がつきやすいわで大変そうなのだから何を考えていたのやら。
 でも、5本もあったら良い意味でも悪い意味でもハレム状態、もとい、イスラムでの一夫多妻制状態。選び放題だけど分け隔てなく愛を注ぐには多大な苦労が必要です。3倍どころじゃない、通常の5倍ですよ。楽器って愛を注がないと(弾き込まないと)良い音で歌ってくれませんから。盗むような人にその覚悟が有るかは疑わしいですけど。
 あー、誰か良いコントラバス恵んでくれないかしらん。あ、その前に運べる車と置ける場所と練習できる場所(低音で響くから結構厳しいの!)も準備しなきゃね、自分…。
さ、今回も雑談です。一応サイト管理に関係している事はそのタグをつけているのでそこから辿るとよさげです。

 PukiWikiで304を送信する仕組みを色々調整していたのですが、はまった点があったので備忘録代わりに記事にします。

Cache-Control&Expiresヘッダの送信はApacheとScriptの両方が絡む
 レスポンスヘッダのCache-Control&Expireはローカルキャッシュの寿命を指定できます(順に、キャッシュは使用しない・キャッシュ有効期間は今から3,600秒・グリニッジ標準時2010-09-08 00:00:00まで有効)。

Cache-Control: no-cache
Cache-Control: max-age=3600
Expire: Wed, 08 Sep 2010 00:00:00 GMT

これはPHP Scriptでも送信できます。例えばCache-Controlなら

header("Cache-Control: no-cache");
header("Cache-Control: max-age=3600");

と出来ますでも、Apache側でも設定をいじって送信するように出来ます(.htaccess他, Apache 1.3系でも可能)。

ExpiresActive On
ExpiresDefault "access plus 10 days"

 ではここでApache側のその設定を残したままでScript側からもCache-Controlヘッダを送信してみましょう

header("Cache-Control: no-cache");

さあ、どう返ってくるでしょうか。

Cache-Control: no-cache, max-age=864000

えーっ?追加されちゃうんですかっ。ブラウザさんはどう解釈するんだろう、これ2

 ではScript側を修正してみましょう。max-ageを既に準備しちゃえばApacheさんも遠慮するに違いない。

header("Cache-Control: no-cache, max-age=0");

するとこうなります。

Cache-Control: no-cache, max-age=0, max-age=864000

えーーっ。まぢっすかっ。ブラウザさん(以下同文)。

 色々試行錯誤してScript側からこう出力すると

header("Cache-Control: no-cache");
header("Expires: Wed, 08 Sep 2010 15:41:03 GMT");
Cache-Control: no-cache
Expires: Wed, 08 Sep 2010 15:41:03 GMT

となり、ようやくApacheさんは遠慮してくれました。つまり、ExpiresヘッダもScript側で準備しないといけないみたいです。Apache側でこの機能を提供するmod_expiresのドキュメントによるとCache-ControlとExpiresの両方の出力に影響するとの事なのでこの挙動はそう不自然ではありません。Cache-Controlにどんどん追加してくだけってのはちょっとアレですが。

 じゃあ、Script側でこうしたら…

header("Cache-Control: no-cache");
header("Expires: HOGE");
Cache-Control: no-cache
Expires: HOGE

Apacheさん、チェックがあまいっすー。またこんなのも

header("Cache-Control: max-age=65535");
header("Thu, 01 Jan 1970 00:00:00 GMT");
Cache-Control: max-age=65535
Expires: Thu, 01 Jan 1970 00:00:00 GMT

Cache-ControlとExpiresの内容のミスマッチでもApacheさんスルーします。まぁいちいちチェックされると不便な事もあるのでこれらの挙動はそう問題ではないのですが…ブラウザさん(以下同文)。

 色々面白い現象も見られましたが、結論としてはExpiresヘッダをScript側で(値はどうであれ)出力すればCache-Controlで発生する現象は回避できるという事です。

 あと、ApacheのExpiresヘッダ送信機能はファイルのMIME毎に指定も出来ます。

ExpiresActive On
ExpiresByType image/jpeg "access plus 30 days"

これは通常の画像ファイル直のアクセスでは当然のごとく作用しますが、Script経由で画像等を表示する場合3でも適用されます。深く考えずに利用できるのは便利なのですが、場合によってははまる箇所になりそうなのでこれもメモしておきます。

  1. 一本なら軽自動車にも入りますが運転は多少厳しくなります []
  2. 無難に考えるならorで判定?調べるの面倒なんでやってませんが []
  3. 例:PukiWikiのrefプラグイン []

コメントを残す

メールアドレスが公開されることはありません。