きっかけ(2013/4/19 更新)
D.D. を Gogengo! にリニューアルするにあたって、古いドメイン(http://www.ddic.jp/)を新しいドメイン(http://gogengo.me/)にリダイレクトしたくなりました。
Railsアプリを Thin で動かしていました。例えばリダイレクトするだけのために Nginx を導入するのも大げさなので Rackレイヤーでリダイレクトすることにしました。『How to redirect without www using Rails 3 / Rack? - Stack Overflow』を参考にしました。
※なお、このエントリを書いた 3ヶ月後に Gogengo! を Nginx + Unicorn で動かすよう変更しました。興味のある方はこちらも合わせてお読みください。
やりかた(2013/4/19 更新)
/config/application.rb
module Gogengo class Application < Rails::Application ... config.autoload_paths += %W(#{Rails.root}/lib) ... end end
/config/environments/production.rb
Gogengo::Application.configure do ... config.middleware.use 'RequestRedirector' ... end
/lib/request_redirector.rb
class RequestRedirector OLD_DOMAIN = 'www.ddic.jp' NEW_DOMAIN = 'gogengo.me' def initialize(app) @app = app end def call(env) request = Rack::Request.new(env) if request.host.starts_with?(OLD_DOMAIN) [301, {'Location' => request.url.sub(OLD_DOMAIN, NEW_DOMAIN)}, self] else @app.call(env) end end def each(&block) end end
確認
Thin を再起動して http://www.ddic.jp/ にアクセスしたら、ちゃんと http://gogengo.me/ にリダイレクトされました!