第二で、HEAD アクセス時にそもそも CGI をアクセスせずに更新時刻を返すようにしてみました。以下の記述は第二 tdiary.net 用の設定ですが、適宜読み変えて参考にしてください。
まず httpd 実行 uid で writable な /home/tdiary/antenna というディレクトリを作ります。
次に、以下のようなプラグインを置きます。
#
# record update time
#
antenna_dir = '/home/tdiary/antenna'
if /^(comment|append|replace|trackbackreceive)$/ =~ @mode then
begin
if /^([^.]*)\.tdiary\.net$/i =~ ENV['HTTP_HOST'] then
File.new("#{antenna_dir}/#{$1}", 'w').close
end
rescue
end
end
そして、.htaccess なり httpd.conf なりで次のように rewrite します。
RewriteCond %{REQUEST_METHOD} HEAD
RewriteRule ^([^.]+)\.tdiary\.net.* /home/tdiary/antenna/$1 [L]
ちなみに、最新日記ではなく過去の日記あてにアンテナと思われる HEAD アクセスがあるのですが、上記の例だと問答無用で最新日記の last_modified を返してしまいます。個人的には「仕様です」でいいと思いますが、いまのところは YYYYMMDD.html あての HEAD アクセスは cgi を呼ぶようにしています。
なお、最初の導入時に、あらかじめ全ての日記について上記のようなファイルを用意しておかないと、導入後に更新するまで 404 が返ってしまいますので、www.tdiary.net で配布している tdiary.lirs を元に以下のスクリプトで一括作成しました。
#!/usr/bin/env ruby
data_dir='/home/tdiary/data'
antenna_dir='/home/tdiary/antenna'
if (ARGV.size != 1) then
puts "USAGE: touch_antenna.rb tdiary.lirs"
exit(1)
end
diaries = Dir.glob("#{data_dir}/*").collect{|x| File.basename(x)}
f = File.new(ARGV[0])
while (line = f.gets)
next unless %r|^LIRS,([^,]*),[^,]*,[^,]*,[^,]*,http://([^.]+)\.tdiary\.net/,| =~ line
next unless diaries.include?($2)
mtime = Time.at($1.to_i)
user = $2
File.new("#{antenna_dir}/#{user}", "w")
File.utime(0,mtime,"#{antenna_dir}/#{user}")
puts user
end
お,信州.新幹線ならうちまで1時間かからんよ.<br>「遊びに来なさい」と言いたいところだけど,ヨメが試験勉強中だからなぁ…
いーなー > 避暑<br>File.newしたファイル、明示的に閉じた方がいいかもですね<br>空のブロックをおくかFile.new(...).closeする?
@modeにtrackbackreceiveも入れてねーん.
ご指摘ありがとうございます。そのように修正しました>zunda さん、きたさん。