2007/06/13
■[tDiary]このサイトが出力するRSSって、何かおかしくなってますか?(続報)
(前回までのあらすじ)
まだ冬の寒さの残る3月上旬、無印吉澤の管理人こと吉澤は、数少ない読者の一人から「日記は全然更新されてないくせに、RSSの通知が毎日のように飛んできてうざい」という知らせを受ける。未だにSharpReaderを使っている吉澤には身に覚えのない話であったが、どうやらOutlook 2007でRSSを購読している場合に発生する問題らしい。内心「Outlook 2007なんて知らないよ!」と思いながらも吉澤は独自の調査を開始。
その後の3ヶ月に渡る調査では何の手掛かりも得られず、事件は迷宮入りかと思われた。しかし、いい加減嫌になって日記に愚痴を書き込んだところ、また別の読者から「Sleipnir標準のRSSリーダでも再現しますよ」との目撃情報を入手。(Outlookなんて買う気しないけど、Sleipnirなら無料で手に入るじゃないか……!)と俄然やる気が出てくる吉澤であった。
----
ちょうど今日はお休みをもらってほぼ一日家にいたので、Sleipnir 2.5.13(+IE 6.0)のRSSリーダでちょこちょこと無印吉澤のRSSをチェックしてみたところ、朝の9:31に早速問題が再現しました。症状は、前回の日記でみやさんがコメントされていた通りです。確かにこれはうざいですね……。
その後も何度か問題が再現したため、その都度index.rdfを保存。また、無印吉澤を置いてるさくらインターネットのサーバに繋いで、index.rdfのタイムスタンプのチェックも行ってみました。その結果を見るに、どうやらうちのサイトでは以下のような現象が起こっていたようです。
- RSSを更新する必要のない(日記やコメントの書き込みが無い)状況であっても、1〜3時間に一度のペースでindex.rdfが更新される
- このindex.rdfは、通常は"muziyoshiz.jp"宛のリンクを含んでいる
- しかし、稀にサイトのURLが"www.muziyoshiz.jp"になっているRSSで、index.rdfが更新される*1
そして、IEのレンダリングエンジンを利用するRSSリーダでこのようなindex.rdfをチェックしていると、
- "muziyoshiz.jp"宛のリンクを含むindex.rdfを読んだあとで、"www.muziyoshiz.jp"宛のリンクを含むindex.rdfを読む
- "www.muziyoshiz.jp"宛のリンクを含むindex.rdfを読んだあとで、"muziyoshiz.jp"宛のリンクを含むindex.rdfを読む
のいずれかの状況で、全ての日記・コメントが更新されたように見えてしまっていました。つまり、これが今回の問題の正体だったわけです。
----
しかし、こうして問題が分かったところで、以下の2つの疑問点が浮かんできます。
- 何故、RSSを更新する必要のない状況でindex.rdfが勝手に、頻繁に書き換わっているのか?
- 何故、"muziyoshiz.jp"が使われる場合と"www.muziyoshiz.jp"が使われる場合の両方が混在しているのか?
前者については、正直よく分かりません。Anti Referer Spamプラグインや、本体のspamフィルタ機能で、スパムメール・トラックバックを破棄するときに何故かRSSを更新しているんでしょうか……?
一方、後者については、ほぼ間違いなくmakerssプラグインが関係してそうです。早速misc/plugin/makerss.rbを読んでみると、URLを作る部分はこうなってました。
rdf_url = @conf['makerss.url'] || "#{@conf.base_url}index.rdf"
僕は@conf['makerss.url']を設定してなかったので、@conf.base_urlがそのままindex.rdfに埋め込まれてるはず。そして、このbase_urlを作っているのは、恐らくtdiary.rbの以下のメソッドです。
def base_url return '' unless @cgi.script_name if @cgi.https? port = (@cgi.server_port == 443) ? '' : ':' + @cgi.server_port.to_s "https://#{ @cgi.server_name }#{ port }#{File::dirname(@cgi.script_name)}/" else port = (@cgi.server_port == 80) ? '' : ':' + @cgi.server_port.to_s "http://#{ @cgi.server_name }#{ port }#{File::dirname(@cgi.script_name)}/" end.sub(%r|/+$|, '/') end
これ以上コードを辿る方法が分からなかったので、自信は無いのですが……tDiary を port forward 越しに使うと一部おかしい(あーありがち)にも同様の記述があったので、恐らくここだと思います。このメソッドの返り値が、場合によって"muziyoshiz.jp"だったり"www.muziyoshiz.jp"だったりするということなんでしょうか?? うーん。
よく分かりせんが、暫定的な対処として、tdiary.rbと同じディレクトリにある方のtdiary.confに以下のコードを追加して明示的にbase_urlを指定してみました。参考にしたのは、Diary.org - [release] tDiary 2.0.2、2.1.2リリースと[tDiary-devel] Re: base_url について。
# Fix base URL def base_url 'http://muziyoshiz.jp/' end
何故index.rdfが勝手に更新されるのか、という問題については分からないままですが、しばらくこれで様子を見ようと思います。もし、まだ問題が解決してないようでしたら、コメントかメールで教えてください。ご迷惑をおかけしますが、よろしくお願いします_| ̄|○
*1 index.rdfは自動的に頻繁に上書きされ、その大半は"muziyoshiz.jp"宛のリンクを含んでいるために、今までの調査では"www.muziyoshiz.jp"宛のリンクを含むindex.rdfを見つけられなかったのだと思います。
また、この日記に無関係と判断したコメント及びトラックバックは削除する可能性があります。ご了承ください。