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

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

rack-ssl で http と https を混在させようとして諦めた

表題の通りのメモ。rails で一部のパスだけ http 、他は https にしたいなーと思ってざっくり調べたのでした。

調べたこと

  • Rails 3 では config.force_ssl = true としたら rack-ssl が使われる
    • Rails 4 では ActionDispatch::SSL が使われる
    • ソース見た感じ、 ActionDispatch::SSL は rack-ssl を少しだけいじったものに見える
  • rack-ssl には、ssl の対象にならない条件を exclude オプションに callable なオブジェクトを渡すことで指定できる
  • Rails 4(ActionDispatch::SSL) では exclude オプションが無い

なぜ ActionDispatch::SSL に exclude オプションが入っていないか(削除されたか)というと、 rack-ssl(および ActionDispatch::SSL) で使われる HSTS はドメインごとの指定なので、そもそも rack-ssl (およびActionDispatch::SSL)は http/https の混在をさせる想定の設計じゃないんだよとのこと。

もし Rails 4 で exclude オプション使いたければ、 ActionDispatch::SSL と rack-ssl を差し替えてやればできそう。しかし上述の理由によりほぼ意味がない。

結論

http/https の混在環境を作りたければ ActionController の force_ssl を使うべき。

参考