2013-05-31 38 views
0

由於我的通配符SSL不支持根域,因此我正在使用Rack Rewrite將我的apex/root域重定向到我的www域。我也想強制SSL站點範圍,但似乎無法讓我的重寫發生在強制SSL之前。我已經嘗試了一些東西,也就是在這個答案的響應:https://stackoverflow.com/a/8217170/535632force_ssl之前的機架重寫Rails> 3.2 Heroku

這裏是我重寫代碼:

Gospot::Application.config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do 

    if Rails.env.production? 
     r301 %r{.*}, Proc.new {|path, rack_env| "http://www.#{rack_env['SERVER_NAME']}#{path}" }, 
       :if => Proc.new {|rack_env| rack_env['SERVER_NAME'] == 'mydomain.com'} 
    end 
end 

我已經試過:

require 'rack/ssl' 
Gospot::Application.config.middleware.insert_before(Rack::SSL, Rack::Rewrite) do 

而不是在production.rb使用config.force_ssl = true但在Heroku上出現以下錯誤:

No such middleware to insert before: Rack::SSL (RuntimeError) 

是否有無法在force_ssl之前運行我的機架重寫?我發現了很多答案,但它們似乎都適用於Rails < 3.1

回答

1

根據您的DNS提供商,最簡單的方法是使您的apex DNS記錄您的www子域的CNAME。

如果這對你不起作用,那麼你應該找到一箇中間件,它存在於你的堆棧中,以便在此之前進行重寫。試試這個:

heroku run rake middleware

要了解您的中間件堆棧是什麼樣子的想法。選擇一個鏈條上相對較高的中間件,然後將其重寫。這裏肯定會有一些猜測和檢查,但這最終會糾正你的問題。

+0

謝謝,我沒有想到有關創建CNAME的頂點記錄到WWW(目前我只是它要Heroku的應用程序)。 –

3

我遇到了同樣的問題,我想在強制SSL之前使用機架重寫來基於域進行重定向。通過在ActionDispatch :: SSL之前插入Rack :: Rewrite中間件,我可以在Rails 4中實現這一點,如下面的代碼所示。

config.middleware.insert_before(ActionDispatch::SSL, Rack::Rewrite) do 
    # redirects/rewrites here 
end 
0

我有同樣的問題(Rails 3)。顯然,force_ssl將Rack:SSL添加到中間件的頂部。要在它之前插入,你必須把它作爲一個字符串添加,否則你會得到一個「未初始化的常量」錯誤。

這是我最後使用的代碼:

SM::Application.config.middleware.insert_before("Rack::SSL", Rack::Rewrite) do 
    # rewrite code 
end