2011-09-21 51 views
4

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

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

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

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

任何想法?

每Nathan的评论:

我有一个不完美的解决方案。我的root_path不是强制ssl。敏感信息的所有部分都强制它。抵达后,所有的流量被定向到www这个在我的routes.rb:

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

+0

你能解释一下你做了什么来解决这个问题吗?我有同样的问题。我看到你接受了一个答案,但我不确定在阅读后应该尝试什么。谢谢! –

+0

在heroku上托管时,我遇到了各种指南中的相同问题。我从来没有想过没有去通配证书。 – Kombo

回答

2

由于您的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 

而且我还用ensure_domain从切换过滤器前,将其添加为上ApplicationController

before_filter :force_ssl 

http://example.comhttp://www.example.com。确保在force_ssl之前调用过滤器之前。