【问题标题】:Rack Rewrite before force_ssl Rails > 3.2 Herokuforce_ssl Rails > 3.2 Heroku 之前的机架重写
【发布时间】:2023-11-12 07:58:01
【问题描述】:

我正在使用 Rack Rewrite to 301 将我的 apex/root 域重定向到我的 www 域,因为我的通配符 SSL 不支持根域。我还想在整个站点范围内强制使用 SSL,但似乎无法在强制 SSL 之前进行重写。我已经尝试了一些东西,即这个答案中的响应:https://*.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 之前运行我的机架重写?我找到了很多答案,但它们似乎都适用于 Rails

【问题讨论】:

    标签: ruby-on-rails heroku rack


    【解决方案1】:

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

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

    heroku run rake middleware

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

    【讨论】:

    • 谢谢,我没有想过为 www 的顶点记录创建一个 CNAME(目前我只是将它转到 heroku 应用程序)。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题(Rails 3)。显然 force_ssl 将 Rack:SSL 添加到中间件的顶部。要在它之前插入,您必须将其添加为字符串,否则您将收到“未初始化常量”错误。

      这是我最终使用的代码:

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

      【讨论】: