last_modified plugin

激しく作りかけなのでちゃんと動くか知りませんが、last_modifiedという、Last-Modifiedヘッダを吐き、If-Modified-Since付きのリクエストの場合は対応して304 Not Foundを返すプラグインを作ってみました。まだココでは使っていません。ローカルで動かしたblosxomLiveHTTPHeadersとにらめっこしながらチェックした感じでは、304を吐いて$blosxom::outputを空にしてもちゃんとドキュメントが表示されるので、ちゃんと動いてそうな感じですが・・・。

最初はstoryサブルーチンでファイルのタイムスタンプ(writebackのデータファイルも含め)をチェックしてたんですが、これだと完全にblosxomの出力を生成してしまうわけで、転送量は減っても、CGIの負荷はそのまんまなわけです。

で、以下のようにしました。

  1. ファイルリストを取得
  2. エントリ生成の対象になるっぽいファイルをリストアップ
  3. 一番更新の新しいファイルの更新時刻を取得
  4. $ENV{'HTTP_IF_MODIFIED_SINCE'}と比較

で、更新されてなかった場合は$blosxom::headerを304ステータスだけにし、$blosxom::outputを空にします。そうでない場合は$blosxom::headerにLast-Modifiedを追加すると。この最後のIf-Modified-Sinceの判定をskipサブルーチンにしてやったので、304 Not Modifiedを吐くべき時はheadstoryなどを通過しないので負荷が減るという感じ。机上の論理では。妄想ともいう。

まぁあれだ。lastmodifiedをwritebackのデータファイルも見るようにした方が話は早いので、賢い人はそうしましょう。

追記

気づいたところのメモ・・・というか誰か直すアイディアくれメモ。

コメント投稿で反映されない(ことがある)のは致命的・・・。月ごとアーカイブとかは静的生成してしまえば良い気がするので、サポートしない方向で何卒(なにとぞ)。

追記@2004/09/04

稼動開始。一時間ほどリロード→500エラーという挙動になってたのはヒミツだ。permalinkでの動作をONにして、コメント投稿が反映されない問題は、リファラチェックで回避。月ごとまたは日ごとの閲覧への対応は本当にメンドイ、というかメンドイ方法しか思いつかない。pagingは対応しても無駄っぽいのでシカト。

うまく動いてる感じ。ベース的にはどこでも使える感じですが、微妙にこのサイト専用的な感じ。ちっとチェックしきるのはムリぽいなぁ・・・。

公開ファイルも使用中のもの相当に差し替えておきました。

追記 #2@2004/09/04

Internet Explorerは、

If-Modified-Since: Fri, 03 Sep 2004 19:54:17 GMT; length=55438

てな感じで送信してくるので、セミコロン以降が処理できておらず、str2time()が失敗しているのか、500エラー吐いてましたよ(lengthは前回リクエスト時のContent-Lengthっぽい感じ)。ので、最初のセミコロン以降をバッサリと切り捨ててからstr2time()に渡すようにしてみた(日付けの間にセミコロンはきっと出てこない)。これでOKぽい。OperaなんかでもOKでした。

Internet Explorerで送信しているHTTPヘッダを見るにはieHTTPHeadersが良いす(Proxomitronとかで良いかも)。Operaで見る方法はないかな・・・(←教えろと控えめに書いてみました)。

公開ファイルも使用中のもの相当に差し替え、適当至極なコメントを書いておきました。

てか、こういうのにスクリプトで頑張って対応するのは凄い大変。(一部)動的生成なlivedoor Blogとかは、中でSledgeが頑張ってたりするのかな(Sledgeかどうか知らんけど)? JUGEMはLast-Modifiedは吐いていないので、必然的にIf-Modified-Sinceにも対応してないぽい。