2011-09-21 95 views
4

我正在將應用程序移動到heroku,並且在使用ssl和重定向時遇到了一些問題。在force_ssl之前重定向到'www'

我在rails 3.1上,我試過在production.rb環境中用中間件強制ssl。我都嘗試將它添加到應用程序控制器。

問題是,當我執行ssl的完整站點強制時,在達到SSL要求之前,我無法重定向到www。這很重要,因爲如果用戶訪問https://mydomain.com,則會顯示一個錯誤的SSL證書警告。如果他們繼續,他們然後重定向到'www'。

SSL強制正在工作,重定向到'www'子域正在工作,我只需要首先執行重定向。

任何想法?

每Nathan的評論:

我有一個不完美的解決方案。我的root_path不是強制ssl。敏感信息的所有部分都強制它。抵達後,所有的流量被定向到www這個在我的routes.rb:

constraints(:host => "domain.com") do 
    match "(*x)" => redirect { |params, request| 
    URI.parse(request.url).tap { |x| x.host = "www.domain.com" }.to_s 
    } 
    end 

這可能隱藏了大部分的問題,由時間來對用戶符號或其他任何點擊,他們現在在www域。瀏覽器不會發出有關證書的警告。這對這個特定的項目工作得很好。另一個項目我最終花了大筆錢購買一張已簽名的通配符證書。

對不起,不是真正的解決方案。如果您去https://domain.com/forcedsslpath該項目仍然會提供安全警告。

+0

你能解釋一下你做了什麼來解決這個問題嗎?我有同樣的問題。我看到你接受了一個答案,但我不確定在閱讀後應該嘗試什麼。謝謝! –

+0

在heroku上託管時,我遇到了各種指南中的相同問題。我從來沒有想過沒有去通配證書。 – Kombo

回答

2

由於您的301正在由應用程序發送,而且請求甚至無法在觸及中間件(運行rack-ssl)之前到達應用程序,您唯一的解決方案是更改中間件或執行重定向在它甚至擊中中間件之前。

對於後者,你必須捅Heroku。我自己不使用它。在VPS部署中,您只需在面向前向的Web服務器(Apache,nginx)上添加重定向,即可觸及中間件。這似乎是一個常見的情況,所以我想像Heroku可能爲你提供了一些東西。

對於前者,應該不難。 rack-ssl中間件非常非常簡單,並且不應該很難根據您的需求來修改它。

https://github.com/josh/rack-ssl/blob/master/lib/rack/ssl.rb#L58

我想,像url.host = "www.myhost.com"可能是你想要的東西(雖然你可能會說有可能是更多的FQDN無關的方式來做到這一點)。

2

以下是我如何解決問題。我從production.rb刪除config.force_ssl = true和替代使用:

添加此方法ApplicationController

def force_ssl 
    if Rails.env.production? 
     redirect_to :protocol => 'https' unless request.ssl? 
    end 
    end 

而且我還用ensure_domain從切換過濾器前,將其添加爲上ApplicationController

before_filter :force_ssl 

http://example.comhttp://www.example.com。確保在force_ssl之前調用過濾器之前。