Rails: перенаправление на определенный домен ... но не переопределять SSL? - PullRequest
4 голосов
/ 17 августа 2011

Итак, я перемещаю свое приложение 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, а фильтр before пытается вернуть его на http?

Как бы вы решили эту проблему?

Ответы [ 2 ]

5 голосов
/ 17 августа 2011

Просто соблюдайте текущий протокол:

redirect_to("#{request.protocol}#{APP_DOMAIN}", :status => 301)
2 голосов
/ 31 января 2014

Для исчерпывающего ответа с некоторой долей расширяемости, в целом это выглядит примерно так:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...