簡體   English   中英

在force_ssl Rails> 3.2 Heroku之前進行機架重寫

[英]Rack Rewrite before force_ssl Rails > 3.2 Heroku

我使用Rack Rewrite到301將我的apex /根域重定向到我的www域,因為我的通配符SSL不支持根域。 我也想在整個站點范圍內強制使用SSL,但是似乎無法在強制SSL之前進行重寫。 我已經嘗試了一些方法,即此答案中的響應: https : //stackoverflow.com/a/8217170/535632

這是我的重寫代碼:

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之前是否可以運行機架重寫? 我找到了很多答案,但是它們似乎都適用於<3.1的Rails。

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

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

取決於您的DNS提供商,最簡單的方法是使根尖DNS為www子域記錄一個CNAME。

如果那對您不起作用,那么您應該找到一個確實存在於您的堆棧中的中間件,以將其重寫。 嘗試這個:

heroku run rake middleware

了解中間件堆棧的外觀。 選擇一塊相對較高的中間件,然后將重寫放在前面。 肯定會在這里進行一些猜測和檢查,但這最終將糾正您的問題。

我遇到了同樣的問題(路軌3)。 顯然,force_ssl將Rack:SSL添加到中間件的頂部。 要在其之前插入,必須將其添加為字符串,否則會出現“未初始化的常量”錯誤。

這是我最終使用的代碼:

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

暫無
暫無

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

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