2011-07-15 56 views
32

我正在嘗試爲我的heroku應用設置SSL。我正在使用基於主機名的SSL加載項。 Heroku的documentation規定如下:根域上的Heroku SSL

Hostname based SSL will not work with root domains as it relies on CNAME 
aliasing of your custom domain names. CNAME aliasing of root domains is 
an RFC violation. 

正如預期的那樣一切正常,當我訪問使用WWW子域名網站,即https://www.foo.com。當我訪問https://foo.com時,瀏覽器發出抱怨,因爲所提供的證書是針對heroku.com的。

我的結論是,我有流量重定向foo.comwww.foo.com來解決這個問題。我正在考慮以下方法:基於

1)DNS重定向

的DNS提供商Zerigo supports重定向記錄。我在SO上遇到了類似主題question。我試過這個解決方案,它只能用於HTTP重定向(Zerigo文檔證實了這一點)。

我Zerigo配置:基於

foo.com  A    x.x.x.x 
foo.com  redirect  http://www.foo.com 
www.foo.com CNAME   zzz.amazonaws.com 

2)機架重定向

添加基於機架的中間件來執行重定向。 canonical-host寶石提供這種支持。

use CanonicalHost do 
    case Rails.env.to_sym 
    when :staging  then 'staging.foo.com' 
    when :production then 'www.foo.com' 
    end 
end 

我想知道是否有這個(不包括切換到100 $每月IP基於SSL)

回答

39

哇......這花了我永遠的,和一羣在網絡上的信息是錯誤的。即使Heroku的文檔似乎也沒有表明這是可能的。

但Jesper J的回答提供了一個正確方向的提示:它與DNSimple的ALIAS記錄一起工作,我猜想它是他們創建的一種新的DNS記錄。爲了獲得這種記錄類型(之前使用EasyDNS),我必須將我的DNS服務切換到它們。

爲了澄清,當我說 「作品」 我的意思是:用你的根域

  • 沒有瀏覽器的警告,使用Heroku的端點SSL產品
  • ($ 20 /月)
    • 在SSL整個網站

    它適用於以下網址的全部(將它們重定向到https://foo.com,無任何警告)

    總結的重要位。

    1. 在移動你的DNS來DNSimple(如果有人知道其他供應商提供了一個別名記錄,請張貼在他們的意見,他們是唯一一個我能找到)
    2. 設置Heroku的端點SSL正常https://devcenter.heroku.com/articles/ssl-endpoint
    3. 早在DNSimple添加ALIAS記錄指向foo.com你的Heroku的SSL端點,像waterfall-9359.herokussl.com
    4. 還添加CNAME記錄指向www.foo.com你的Heroku的SSL端點,waterfall-9359.herokussl.com
    5. 終於在軌(或其他)的應用程序進行以下設置:

    production.rb設置

    config.force_ssl = true 
    

    application_controller.rb添加

    before_filter :check_domain 
    
    def check_domain 
        if Rails.env.production? and request.host.downcase != 'foo.com' 
        redirect_to request.protocol + 'foo.com' + request.fullpath, :status => 301 
        end 
    end 
    

    這似乎終於工作了!關鍵部分似乎是ALIAS DNS記錄。如果有人知道,我會很好奇地瞭解它是如何工作的,以及它有多可靠/成熟。似乎做的伎倆,但。

    +2

    Heroku說[這裏](https://devcenter.heroku.com/articles/ssl-certificate),「你必須在」主機名「字段中輸入一個子域名。」因爲根域證書與Heroku的SSL端點不兼容。 您是否創建了根域證書或類似secure.foo.com的內容?這是否會影響'check_domain'中的'request.host'檢查? –

    +1

    您能否確認它是否實際上可以使用根證書。 – Benjamin

    +0

    我使用了一個根證書。我發郵件給Heroku Support,他們說這似乎是人們正在做的事情,而且似乎與一個簡單的ALIAS記錄一起工作。但他們不想贊同某個特定的DNS提供商,因此它不在官方文檔中。如果他們在文檔或這裏添加了某些內容,那將會很好。我可能還沒有意識到其他性能問題,所以我們很好奇從他們的角度來了解更多。 –

    1

    DNS重定向一個更好的解決方案不會理會入站請求是否是HTTP或HTTPS,從而將維持原來的協議 - 所以會重定向http://foo.comhttp://www.foo.com和https一樣。

    您需要在應用程序中通過您找到的寶石或其他機架重定向寶石或如果www。是使用基於IP的SSL插件的問題。

    +0

    設置config.force_ssl = true按Zerigo文檔DNS重定向僅適用於HTTP。 https://www.zerigo.com/blog/2009/07/dns_updates_url_redirection_and_example_code_for_the_api。我的最終解決方案將是兩種風格的混合。 –

    1

    您需要牢記的一件事是,如果兩個版本都可訪問,Google可能會爲您的網站的兩個版本編制索引(根與WWW)。你需要設置圓錐形來處理那些可能會很難維護的問題。

    在我的DNS設置,我設置了一個URL /正向記錄(DNS簡單)

    URL foo.com  3600  http://www.foo.com 
    

    的CNAME設置只需要設置爲WWW

    CNAME www.foo.com 3600  providedsslendpoint.herokussl.com 
    

    我也不得不設置和我的根別名

    ALIAS foo.com 3600  providedsslendpoint.herokussl.com 
    

    然後,我決定簡單地替換foo.com env變量ENV['SITE_HOST'](其中SITE_HOST = www.foo.com或任何我可能定義的)。我可以通過我的heroku配置或我的.env文件來控制它(請參閱https://github.com/bkeepers/dotenv)。這樣,我可以控制在不同環境中發生的事情。

    例如,我的測試應用程序使用test.foo.com作爲url,它也有它自己的SSL端點,因此對我來說工作正常。這也可以擴展以創建分期或qa特定環境。

    before_filter :check_domain 
    
        def check_domain 
        if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST'] 
         redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301 
        end 
        end 
    

    從現在起,終端用戶將始終通過強制SSL訪問www。舊鏈接將遭受小的掛起,但沒有任何明顯的。

    1

    在導軌上的一部分,使重定向,它會更理智,使其發生路由器層上,這樣的(工作on Rails的3+):

    Rails.application.routes.draw do 
    
        match '/*splat' => redirect { |_, request| request.url.sub('//www.', '//') }, :constraints => { :subdomain => 'www' } 
    
        # ... 
    
    end 
    
    0

    對於用戶的Heroku之前使用godaddy,我剛剛完成將DNS從godaddy移植到cloudflare。 https現在工作正常。

    Godaddy DNS與heroku不兼容。這是由於:

    某些DNS提供商將只提供根域的A記錄。 不幸的是,A記錄不足以將您的根目錄 域指向Heroku,因爲它們需要靜態IP。這些記錄在諸如 內部數據中心,雲基礎架構服務以及像Heroku這樣的平臺 的環境中使用時具有 嚴重的可用性影響。由於Heroku使用動態IP地址,因此需要 使用類似CNAME的記錄(通常稱爲ALIAS或ANAME記錄) ,以便您可以將根域指向另一個域。

    設置相當簡單。

    首先,將cloudflare的名稱服務器添加到godaddy dns管理器中。以下是一些例子:

    roxy.ns.cloudflare.com sam.ns.cloudflare.com

    接下來,你只需要兩個步驟。

    1. 添加CNAME NAME.com並將其鏈接到NAME.com.herokudns.com
    2. 就是這樣。這是假設你已經有了如果您使用Rails的一個CNAME www.NAME.com鏈接到www.NAME.com.herokudns.com

    ,一定要在config/environment/production.rb