web-dev-qa-db-ja.com

Rails-http://example.comからhttps://www.example.comにリダイレクトする方法

アプリの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

35
AnApprentice

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 => "" }
18
edgerunner

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
51
Jon

これはいつでもproduction.rbにスローできます... config.use_ssl = true

7
user2100689

これは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を使用するときにルートを少し調整する必要があるかもしれませんが、これは私たちが行った方法であると思われるので、ここではそれらの詳細については説明しません。その複雑さを避けるために、上記のコードを変更しました。

ハッキングハッピー。

7
user693960

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!

7
Robin Daugherty