Ruby on rails 强制ssl导轨之前的机架重写>;3.2 Heroku

Ruby on rails 强制ssl导轨之前的机架重写>;3.2 Heroku,ruby-on-rails,heroku,rack,Ruby On Rails,Heroku,Rack,我正在使用Rack Rewrite将我的apex/root域重定向到我的www域,因为我的通配符SSL不支持根域。我还想在站点范围内强制SSL,但似乎无法在强制SSL之前进行重写。我试过几件事,也就是这个答案中的回答: 以下是我的重写代码: Gospot::Application.config.middleware.insert_before(Rack::Runtime, Rack::Rewrite) do if Rails.env.production? r301 %

我正在使用Rack Rewrite将我的apex/root域重定向到我的www域,因为我的通配符SSL不支持根域。我还想在站点范围内强制SSL,但似乎无法在强制SSL之前进行重写。我试过几件事,也就是这个答案中的回答:

以下是我的重写代码:

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\u ssl=true
,而是在Heroku上得到以下错误:

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

在force_ssl之前是否需要运行机架重写?我已经找到了很多答案,但它们似乎都适用于Rails<3.1

最简单的方法是,根据您的DNS提供商,让您的apex DNS记录成为您的
www
子域的CNAME

如果这对您不起作用,那么您应该找到一个确实存在于堆栈中的中间件,将此重写放在之前。试试这个:

heroku运行rake中间件


了解中间件堆栈的外观。选择一个相对较高的中间件,并将重写放在它之前。这里肯定会有一些猜测和检查,但这最终会纠正您的问题。

根据您的DNS提供商,最简单的方法是将您的apex DNS记录作为您的
www
子域的CNAME

如果这对您不起作用,那么您应该找到一个确实存在于堆栈中的中间件,将此重写放在之前。试试这个:

heroku运行rake中间件


了解中间件堆栈的外观。选择一个相对较高的中间件,并将重写放在它之前。这里肯定会有一些猜测和检查,但这最终会纠正您的问题。

我遇到了同样的问题,我想在强制SSL之前使用rack rewrite根据域重定向。通过在ActionDispatch::SSL之前插入Rack::Rewrite中间件,我可以在Rails 4中实现这一点,如下面的代码所示

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

我遇到了同样的问题,我想在强制SSL之前使用rack rewrite根据域重定向。通过在ActionDispatch::SSL之前插入Rack::Rewrite中间件,我可以在Rails 4中实现这一点,如下面的代码所示

config.middleware.insert_before(ActionDispatch::SSL, Rack::Rewrite) do 
  # redirects / rewrites here
end
我也有同样的问题(Rails 3)。显然,force_ssl将Rack:ssl添加到中间件的顶部。要在它之前插入,必须将其作为字符串添加,否则将出现“未初始化常量”错误

以下是我最终使用的代码:

SM::Application.config.middleware.insert_before("Rack::SSL", Rack::Rewrite) do
  # rewrite code
end
我也有同样的问题(Rails 3)。显然,force_ssl将Rack:ssl添加到中间件的顶部。要在它之前插入,必须将其作为字符串添加,否则将出现“未初始化常量”错误

以下是我最终使用的代码:

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

谢谢,我没有想到要在www上为apex记录创建一个CNAME(目前我只是将其发送到heroku应用程序)。谢谢,我没有想到要在www上为apex记录创建一个CNAME(目前我只是将其发送到heroku应用程序)。