tDiary を port forward 越しに使うと一部おかしい

※ 長いんでまた日付を未来にずらしてしまう作戦。

とりあえず日記に書いちゃえメソッド。2.1.4 で確認。

具体的には tdiary.rb の base_url メソッドでの URL の組み立て方の問題と、それの適用範囲の問題。

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

別段おかしなところはなさそうに見えるんだけど、port forward してると期待通りに動かない。

例えば localhost 8080 からサーバの 80 に飛ばしているとき、サーバでは 80 に繋がっているわけだから、8080 は無視されてしまう。これを基準に URL を組み立てている RSS auto-discovery や image プラグインは http:// localhost/hogefuga/ へのリンクを生成してしまう。しかし実際にはそこには何もない。通常のリンクは相対で生成しているので、ほんとに一部だけでおかしなことになっている。

対応としてはヘッダの Host フィールドを使う。http:// からの絶対 URI はどうしても必要でなければ極力使わないってだけでずいぶん話は簡単になると思うけど、RSS はそうもいかないし。ただ逆に port forward した URI が RSS に埋め込まれても困る、という別な問題もあったりする。だから

  • base_url は Host を利用できるなら利用し、できない場合は上の処理
    • そのうえで、極力使わない
  • makerss.rb 独自か、あるいは日記の設置 URI という値を用意して、そこに正規の絶対 URI を保存する

って感じで対処するのがいいんだろか。

ちなみに今回自分がどうしたかというと、

@options['image.url']

を設定して http:// からの URI が生成されないようにして回避した。RSS とかその辺は気にしてないものなので無視。

あ。

自画自賛で思いついたけど、日記の設置 URI って値はあったら嬉しいかも。例えば permalink もこれを使うようにできればいい。

なんでかっていうと、このサイトは現在 aligach.net だけれども、www.aligach.net でもアクセスでき、そっちでアクセスしちゃうと TrackBack の送信先とかも www 付きのものになっちゃう。でも複数の URL でアクセスできるってことと permalink が複数あるってのは意味が違うと思うんだよな。できれば permalink は常に aligach.net になってほしい。

そういうときに便利かなと。

More