apacheのrewriteによるredirectをmod_mruby で置き換えてみた

参考

queryがついているURLを扱う場合mod_aliasのredirectでは処理できないので、
mod_rewriteを使うことになるが、数が多いと辛くなる。
また変更の度にapache再起動が必要となる。

.htaccess が使える場合、再起動は不要だが、
apacheをreverse proxyとして利用している場合(ProxyPass)、.htaccess は使えない。

mod_mruby 使ったら簡単にできないかな?と思って少し調べたメモ。

使いそうなディレクティブ

  • mrubyHandlerMiddle
  • mrubyFixupsMiddle

- ProxyPass で扱うURL部分もredirectなどの処理対象にしたい場合はこれ?

  • mrubyQuickHandlerMiddle

- フックポイント ap_hook_quick_handler
- RewriteRule で処理しているURLもmrubyで上書きしたい場合はこれ?

mrubyQuickHandlerMiddle /var/www/mruby/redirect.rb

/var/www/mruby/redirect.rb

何もしない場合はapacheの次の処理に渡すので
Apache::DECLINED を使う

csvの処理にmodule使ってなくて、エラー処理もしてない簡単なsample

r = Apache::Request.new
s = Apache::Server.new

redirect_csv = '/var/www/mruby/redirect.csv'
hash = {}
File.open(redirect_csv, 'r') do |f| 
  while l = f.gets
    key, value = l.chomp.split(",")
    hash[key] = value
  end
end

key = r.uri
if r.args then
  key = key + '?' + r.args
end

if hash[key] then
  r.headers_out["Location"] = hash[key]
  Apache::return(Apache::HTTP_MOVED_TEMPORARILY)
else
  Apache::return(Apache::DECLINED)
end

redirect.csv

/hoge/,http://example.com/hoge/
/fuga/,http://example.com/fuga/
/hogem?num=10,http://example.com/hogem/?num=10