2014-03-13 42 views
7

我的Rails應用程序有兩個域名:app.example.com,short.net。較長的域是標準域,需要HTTPS,較短的域是提供短URL並需要HTTP的便捷域。如何根據域名有條件強制使用SSL?

目前我強迫SSL:

config.force_ssl = true 

但我真的只是想迫使SSL對於較長的域名。我如何根據域名有條件地強制使用SSL?短域名將重定向到主域名,然後被迫使用SSL。這將避免爲短域名申請SSL證書。

想法?

回答

12

添加一些配置,以你的ApplicationController

class ApplicationController < ActionController::Base 
    force_ssl if: :ssl_required? 

    [...] 

    private 
    def ssl_required? 
    request.host == 'app.example.com' 
    end 
end 

來源:http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html

+1

這是相當有趣的時刻。我在下面發佈了我的解決方案,並且非常接近您的建議。我試圖在routes.rb文件中解決這個問題,但我認爲我更喜歡這種方法。 – Joey

+4

請注意,在控制器中設置'force_ssl'並沒有在配置中實現與'config.force_ssl'相同的功能。除了強制重定向外,基於配置的版本還爲每個響應添加了HSTS和安全cookie([source])(https://github.com/rails/rails/blob/794252d70990162d14da17ee854ad353e74297ee/actionpack/lib/action_dispatch/middleware/ ssl.rb#L23)) – seb

+0

'syntax error,unexpected':'force_ssl if::ssl_required?' – bshea

1
class ApplicationController < ActionController::Base 
    force_ssl if: :force_ssl? 

private 

    def force_ssl? 
    if Rails.env.production? || Rails.env.staging? 
     return request.host != CONFIG[:short_host] 
    end 
    return false 
    end 
end