2014-01-28 62 views
3

在我的Rails應用4,我有一個before_action需要用戶先登錄,就像這樣:Rails redirect_to從https(正確)重定向到http(不正確)?

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 
    before_action :require_login 

    def require_login 
    unless logged_in? 
     flash[:alert] = "You must be logged in to access this section." 
     redirect_to login_path 
    end 
    end 

    def logged_in? 
    # more logic 
    end 
end 

當我訪問example.com沒有被登錄,我重定向到example.com/login預期。然而,我在控制檯中看到此錯誤:

The page at 'https://example.com/login' was loaded over HTTPS, but displayed 
insecure content from 'http://example.com/login': this content should also 
be loaded over HTTPS. 

網絡選項卡似乎表明我的redirect_to指向我HTTP,而不是HTTPS。當它遇到HTTP時,它會自動重定向到HTTPS

Request URL:http://example.com/login 
Request Method:GET 
Status Code:301 Moved Permanently 

# In the response headers: 
Location:https://example.com/login 

有沒有辦法告訴redirect_to它應該使用的HHTPS代替HTTP,或者這是一個nginx的配置?我認爲使用login_path而不是login_url將解決這個問題,因爲它應該是相對於基地,但似乎沒有工作。


更新:

我想過使用force_ssl很好,但擔心我正在錘子圖釘。如果我錯了,隨時糾正我。

回答

1

使用#force_ssl

class ApplicationController < ActionController::Base 
    force_ssl # use HTTPS for all actions 

    protect_from_forgery with: :exception 
    before_action :require_login 

    def require_login 
    unless logged_in? 
     flash[:alert] = "You must be logged in to access this section." 
     redirect_to login_path 
    end 
    end 

    def logged_in? 
    # more logic 
    end 
end 
+0

會'force_ssl'影響所有的流量?我也考慮過這個解決方案,但擔心我正在用錘子敲一個圖釘。 – dontmitch

+0

它會影響'ApplicationController'下的所有東西,所以可以控制所有的控制器。你應該把它添加到你想要的控制器中,但是我想這就是你定義了'login'動作的控制器。 – Agis

6

在你application.rb(或environment.rb),你可以設置

config.force_ssl = true 

這將使Rails的一直使用安全終點。