簡體   English   中英

在force_ssl之前重定向到'www'

[英]redirect to 'www' before force_ssl

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

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

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

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

有任何想法嗎?

Per Nathan的評論:

我有一個不完美的解決方案。 我的root_path不強制ssl。 所有包含敏感信息的部分都會強制它。 抵達后,所有流量都會通過我的routes.rb指向www。

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 ,項目仍會提供安全警告。

由於您的301是由應用程序發送的,並且請求在訪問中間件(運行rack-ssl之前)之前甚至無法到達應用程序,因此您唯一的解決方案是更改中間件或在重新定向之前進行重定向中間件。

對於后者,你必須在Heroku附近捅。 我自己不用它。 在VPS部署中,您只需在面向前端的Web服務器(Apache,nginx)上添加重定向,然后再訪問中間件。 這似乎是一個常見的情況,所以我想Heroku可能會為你提供一些東西。

對於前者,它應該不難。 rack-ssl中間件非常非常簡單,根據您的需要進行monkeypatch它應該不難。

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

我想像url.host = "www.myhost.com"這樣的東西可能就是你想要的東西(雖然你可能知道可能有更多與FQDN無關的方法)。

這是我解決問題的方法。 我從production.rb刪除了config.force_ssl = true ,而是使用:

將此方法添加到ApplicationController

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

並在ApplicationController上將其添加為之前的過濾器

before_filter :force_ssl

我還使用了從http://example.com切換到http://www.example.comensure_domain 確保在force_ssl之前調用此類過濾器。

您應該可以通過在force_ssl中間件之前運行機架重定向來完成此操作。

這篇文章向您展示了如何做到這一點。

http://blog.dynamic50.com/2011/02/22/redirect-all-requests-for-www-to-root-domain-with-heroku/

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM