激しく作りかけなのでちゃんと動くか知りませんが、last_modifiedという、Last-Modifiedヘッダを吐き、If-Modified-Since付きのリクエストの場合は対応して304 Not Foundを返すプラグインを作ってみました。まだココでは使っていません。ローカルで動かしたblosxomをLiveHTTPHeadersとにらめっこしながらチェックした感じでは、304を吐いて$blosxom::output
を空にしてもちゃんとドキュメントが表示されるので、ちゃんと動いてそうな感じですが・・・。
最初はstory
サブルーチンでファイルのタイムスタンプ(writebackのデータファイルも含め)をチェックしてたんですが、これだと完全にblosxomの出力を生成してしまうわけで、転送量は減っても、CGIの負荷はそのまんまなわけです。
で、以下のようにしました。
$ENV{'HTTP_IF_MODIFIED_SINCE'}
と比較で、更新されてなかった場合は$blosxom::header
を304ステータスだけにし、$blosxom::output
を空にします。そうでない場合は$blosxom::header
にLast-Modifiedを追加すると。この最後のIf-Modified-Sinceの判定をskip
サブルーチンにしてやったので、304 Not Modifiedを吐くべき時はhead
やstory
などを通過しないので負荷が減るという感じ。机上の論理では。妄想ともいう。
まぁあれだ。lastmodifiedをwritebackのデータファイルも見るようにした方が話は早いので、賢い人はそうしましょう。
気づいたところのメモ・・・というか誰か直すアイディアくれメモ。
コメント投稿で反映されない(ことがある)のは致命的・・・。月ごとアーカイブとかは静的生成してしまえば良い気がするので、サポートしない方向で何卒(なにとぞ)。
稼動開始。一時間ほどリロード→500エラーという挙動になってたのはヒミツだ。permalinkでの動作をONにして、コメント投稿が反映されない問題は、リファラチェックで回避。月ごとまたは日ごとの閲覧への対応は本当にメンドイ、というかメンドイ方法しか思いつかない。pagingは対応しても無駄っぽいのでシカト。
うまく動いてる感じ。ベース的にはどこでも使える感じですが、微妙にこのサイト専用的な感じ。ちっとチェックしきるのはムリぽいなぁ・・・。
公開ファイルも使用中のもの相当に差し替えておきました。
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にも対応してないぽい。