繁体   English   中英

在force_ssl之前重定向到'www'

[英]redirect to 'www' before force_ssl

我正在将应用程序移动到heroku,并且在使用ssl和重定向时遇到了一些问题。

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

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

SSL强制正在运行,重定向到'www'子域正在工作,我只需要先进行重定向。

有任何想法吗?

Per 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 ,项目仍会提供安全警告。

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

对于后者,你必须在Heroku附近捅。 我自己不用它。 在VPS部署中,您只需在面向前端的Web服务器(Apache,nginx)上添加重定向,然后再访问中间件。 这似乎是一个常见的情况,所以我想Heroku可能会为你提供一些东西。

对于前者,它应该不难。 rack-ssl中间件非常非常简单,根据您的需要进行monkeypatch它应该不难。

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

我想像url.host = "www.myhost.com"这样的东西可能就是你想要的东西(虽然你可能知道可能有更多与FQDN无关的方法)。

这是我解决问题的方法。 我从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

我还使用了从http://example.com切换到http://www.example.comensure_domain 确保在force_ssl之前调用此类过滤器。

您应该可以通过在force_ssl中间件之前运行机架重定向来完成此操作。

这篇文章向您展示了如何做到这一点。

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

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM