アプリのURLをクリーンアップする方法を知りたいです。私のアプリはHerokuのRails 3を使用しています。
目的のURLはhttps://www.example.comite.com
上記とは異なるすべてのURLをそのURLにリダイレクトしたい。これはRails事ですかDNSですか?
不正なURL:
https://example.comite.com
http://www.example.comite.com
http://example.comite.com
そして、何かが後に続く場合、http://www.example.comite.com/photo/1
は、次のパスでリダイレクトされるURLです:https://www.example.comite.com/photo/1
DNSレコードはドメインのプロトコルを定義できないため、リダイレクトできませんhttp://
からhttps://
DNS経由。 Webサーバー構成を介してそれを行うことは、移植性がなく、実行が難しく、エラーが発生しやすく、単に時代遅れです。これは、Railsルーターで最もよく処理されるジョブです。
# beginning of routes.rb
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :protocol => "http://" }
match "*path" => redirect("https://www.mysite.com/%{path}"), :constraints => { :subdomain => "" }
ser2100689の回答 の拡張として、Rails 3+では、config.force_ssl = true
inconfig/environments/production.rb
行は次のようにコメントを外すことができます
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true
これはいつでもproduction.rbにスローできます... config.use_ssl = true
これはHerokuであるため、Apacheまたはnginx構成を使用できません。あなたができることは、あなたがApplicationControllerにbefore_filterを置くことです、以下のような3つ以上のコントローラがあると仮定しますが、もちろんそれらは別々のファイルになります
class ApplicationController < ActionController::Base
def redirect_https
redirect_to :protocol => "https://" unless request.ssl?
return true
end
before_filter :redirect_https
end
class TypicalController < ApplicationController
def blah
end
end
class HomePageController < ApplicationController
skip_before_filter :redirect_https
end
また、deviseを使用するときにルートを少し調整する必要があるかもしれませんが、これは私たちが行った方法であると思われるので、ここではそれらの詳細については説明しません。その複雑さを避けるために、上記のコードを変更しました。
ハッキングハッピー。
Rails 3.1.0以降にはforce_ssl
は、非開発環境のhttpsにリダイレクトするコントローラーメソッドです。
http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html
リダイレクトしたい各コントローラーに配置します。さらに良いのは、ApplicationControllerに配置します。
app/controllers/application.rb:
class ApplicationController < ActionController::Base
# ...
force_ssl
# ...
end
これは常にアプリに含めることをお勧めします(もちろん、証明書を取得する必要があります)。 HTTPS Everywhere!