【问题标题】:redirect to 'www' before force_ssl在 force_ssl 之前重定向到“www”
【发布时间】:2011-11-22 08:17:53
【问题描述】:

我正在将应用程序移至 heroku,但遇到了一些 ssl 和重定向问题。

我在 Rails 3.1 上,我尝试在 production.rb 环境中使用中间件强制使用 ssl。我都试过将它添加到应用程序控制器中。

问题是,当我执行 ssl 的完整站点强制时,我无法在达到 SSL 要求之前重定向到 www。这很重要,因为如果用户访问https://mydomain.com,将会向他们显示错误的 SSL 证书警告。如果他们继续,他们就会被重定向到“www”。

SSL 强制有效,重定向到“www”子域有效,我只需要先进行重定向。

有什么想法吗?

根据 Nathan 的评论:

我有一个不完美的解决方案。我的 root_path 没有强制使用 ssl。所有带有敏感信息的部分都在强迫它。到达后,所有流量都会在我的 routes.rb 中定向到 www:

constraints(:host => "domain.com") do
  match "(*x)" => redirect { |params, request|
    URI.parse(request.url).tap { |x| x.host = "www.domain.com" }.to_s
  }
  end 

这可以隐藏大部分问题,因为当用户点击登录或其他任何内容时,他们现在位于 www 域。浏览器不会发出有关证书的警告。这对于这个特定的项目来说效果很好。另一个项目,我最终为一个签名的通配符证书支付了大笔费用。

抱歉,不是真正的解决方案。如果您转到https://domain.com/forcedsslpath,该项目仍然会给出安全警告。

【问题讨论】:

  • 你能解释一下你做了什么来解决这个问题吗?我有同样的问题。我看到您接受了答案,但我不确定在阅读后我应该尝试什么。谢谢!
  • 在 heroku 上托管时,我在遵循各种指南时遇到了同样的问题。如果没有通配符证书,我永远不会弄明白。

标签: ruby-on-rails ruby-on-rails-3 ssl heroku


【解决方案1】:

由于您的 301 是由应用程序发送的,并且在命中中间件(运行 rack-ssl)之前请求甚至无法到达应用程序,因此您唯一的解决方案是更改中间件或在之前进行重定向它甚至会命中中间件。

对于后者,您必须绕过 Heroku。我自己不使用它。在 VPS 部署中,您只需在前向 Web 服务器(Apache、nginx)上添加重定向,甚至在它到达中间件之前。这似乎是一个常见的情况,所以我想 Heroku 可能会为您提供一些东西。

对于前者,应该不难。 rack-ssl 中间件非常非常简单,不难对其进行猴子补丁以满足您的需求。

https://github.com/josh/rack-ssl/blob/master/lib/rack/ssl.rb#L58

我想url.host = "www.myhost.com" 之类的东西可能是您想要的(尽管您可能知道可能有更多与 FQDN 无关的方法来实现它)。

【讨论】:

    【解决方案2】:

    这是我解决问题的方法。我从production.rb 中删除了config.force_ssl = true,而是使用了:

    将此方法添加到ApplicationController

      def force_ssl
        if Rails.env.production?
          redirect_to :protocol => 'https' unless request.ssl?
        end
      end  
    

    并将其作为前置过滤器添加到ApplicationController

    before_filter :force_ssl
    

    我也在使用ensure_domain,它从http://example.com 切换到http://www.example.com。确保在 force_ssl 之前调用了这样的前置过滤器。

    【讨论】:

      【解决方案3】:

      您应该能够通过在 force_ssl 中间件之前运行机架重定向来做到这一点。

      这篇文章告诉你怎么做。

      http://blog.dynamic50.com/2011/02/22/redirect-all-requests-for-www-to-root-domain-with-heroku/

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-24
        • 2017-03-24
        • 2013-09-03
        相关资源
        最近更新 更多