at posts/single.html

WikiFarm を動かす (3)

さっきも書いたけど、WikiFarm のプログラムが /bc/farm.cgi に設置されているとすると、 WikiFarm の URL は

http://www.example.com/bc/farm/[ノード名]/[ページ名]

となる。 でも、どうしても farm が冗長な気がする。

http://www.example.com/bc/[ノード名]/[ページ名]

でアクセスできたほうがシンプルでいい。 mod_rewrite が使えれば変換ルールを書いておしまいなんだろうけど、 残念ながらさくらでは使えない。 なので、tDiary と同じように ErrorDocument を使った方法で検討してみる。

まずは .htaccess に以下のように記述する。

DirectoryIndex farm.cgi
ErrorDocument 404 /bc/farm.cgi

こうしておいて、

http://www.example.com/bc/testwiki/FrontPage

にアクセスすると、そのファイルは見つからないので、 /bc/farm.cgi が起動することになる。 そして、 farm.cgi が受け取る環境変数は、

REDIRECT_URL=/bc/testwiki/FrontPage
SCRIPT_NAME=/bc/farm.cgi

となる。 本来なら、

PATH_INFO=/testwiki/FrontPage

となってほしいので、farm.cgi の起動時に環境変数を書き換えるように、farmrc の setup_environment に以下を追加した。

if ENV['REDIRECT_URL']
  ENV['QUERY_STRING'] = ENV['REDIRECT_QUERY_STRING']
  path_info = String.new(ENV['REDIRECT_URL'])
  path_info[File.dirname(ENV['SCRIPT_NAME'])] = ''
  path_info.insert(0, '/') if path_info[0, 1] != '/'
  ENV['PATH_INFO'] = path_info
end

これで短い URL でアクセスできるようになった! …と思ったら落とし穴が。 表示はうまくいくけど、ページの編集ができない。 どうやら、 ErrorDocument で転送した時点で、 POST されたデータは CGI に渡されなくなってしまうみたい。

う〜ん、ぬか喜び。編集時だけ URL を変えるのも面倒だしなぁ。

関連する日記