Rails:重定向到特定域...但不要覆盖SSL?

时间:2011-08-17 14:19:59

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

所以,我正在将我的rails(3.0.9)应用程序从一个域移动到另一个域。 Heroku建议在应用程序控制器中使用before_filter,以确保每个人都在新域上,如下所示:

before_filter :ensure_domain if Rails.env.production?

APP_DOMAIN = 'www.newdomain.com'

def ensure_domain
  if request.env['HTTP_HOST'] != APP_DOMAIN
    redirect_to "http://#{APP_DOMAIN}", :status => 301
  end
end

但是,在某些控制器视图中,我使用的是ssl_requirement,我相信它会做同样的事情但会强制执行ssl协议。

我对请求处理和所有爵士乐并不是那么聪明。我的问题是,这两个是否会创建一个无限循环,SLL尝试重定向到https,而过滤器尝试将其重新发送到http?

您如何解决这个问题?

2 个答案:

答案 0 :(得分:5)

尊重现行协议:

redirect_to("#{request.protocol}#{APP_DOMAIN}", :status => 301)

答案 1 :(得分:2)

对于具有一定可扩展性的综合答案,总体上它看起来像这样;

class ApplicationController < ActionController::Base

  before_filter :redirect_to_example if Rails.env.production?

  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  private

    # Redirect to the appropriate domain i.e. example.com
    def redirect_to_example
      domain_to_redirect_to = 'example.com'
      domain_exceptions = ['example.com', 'www.example.com']
      should_redirect = !(domain_exceptions.include? request.host)
      new_url = "#{request.protocol}#{domain_to_redirect_to}#{request.fullpath}"
      redirect_to new_url, status: :moved_permanently if should_redirect
    end
end

这会将所有内容重定向到domain_to_redirect_to,但domain_exceptions中的内容除外。