おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Rails3 で HTTPS を使うには

Configuring Rails 3 to use HTTPS and SSL – Simone Carletti's Blogの意訳。

Rails 3.1以降

Rails3.1以降からは、このコミットによってHTTPからHTTPSへ遷移させるのがちょう簡単にできるようになった。下記のようにするだけでOK。

# config/application.rb
module MyApp
  class Application < Rails::Application
    config.force_ssl = true
  end
end

このコードの裏側では、Railsrack-sslミドルウェアとして追加している。Rack::SSLは自動的にHTTPのリクエストをHTTPSにリダイレクトする。あとは Strict-Transport-Security ヘッダを付けたりcookieに secure 属性付けたりの機能もあるみたい。

Rails 3.1未満

Rails 3.1未満で同じようにしたい場合は下記のようにする

config.middleware.insert_before ActionDispatch::Static, "Rack::SSL"
# Gemfile
gem 'rack-ssl', :require => 'rack/ssl'

HTTPSとHTTPを両方平行して使いたい場合

HTTPベースのアプリをHTTPSに移行するのは思ってるよりも難しい。サードパーティのホスト(Herokuとかのことかな?)を使っている場合は特に。

Rack::SSL にはドキュメント化されていないけどいい感じの機能がある。:exclude オプションを使うと HTTPS の有効/無効の条件を設定できる。下記のコードは Rack::SSL を有効にしつつ、HTTPSのときだけ Rack::SSL のフィルタをかけるようにしている。

config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' }

Heroku で HTTP のリクエストを HTTPS にリダイレクトさせる場合は Rack::SSL がオススメ。