読者です 読者をやめる 読者になる 読者になる

bekkou68の日記

開発しているサービス, IT技術, 英語など。

Rackレイヤーでリダイレクトする

Rack Gogengo! Ruby on Rails

きっかけ(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/ にリダイレクトされました!