繁体   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