Специфичное для SSL имя хоста в Heroku с Rails 3.1 - PullRequest
5 голосов
/ 13 декабря 2011

В настоящее время у меня есть настройка, где я использую SSL или http, где мне это нужно, с помощью before_filter в контроллере приложения:

def force_ssl
  if params[:controller] == "sessions"
    if !request.ssl? && Rails.env.production?
      redirect_to :protocol => 'https://', :status => :moved_permanently
    end
  else
    if request.ssl? && Rails.env.production?
      redirect_to :protocol => 'http://', :status => :moved_permanently
    end
  end
end

Я хотел бы использовать https://secure.example.com при использовании SSL, но продолжать использовать http://example.com, когда не используется SSL. Можно ли переключаться между именами хостов в зависимости от того, использую ли я SSL?

1 Ответ

4 голосов
/ 16 декабря 2011

Сначала я покажу, как форсировать SSL в текущей и более ранних версиях Rails, а затем в конце я написал, как использовать HTTP и HTTPS параллельно друг с другом, что, как я думаю, вы ищете.

Рельсы> = 3,1 Просто используйте config.force_ssl = true в конфигурации вашей среды.

# config/application.rb
module MyApp
  class Application < Rails::Application
    config.force_ssl = true
  end
end

Вы также можете выборочно включить https в зависимости от текущей среды Rails.Например, вы можете оставить HTTPS выключенным при разработке и включить его при подготовке / производстве.

# config/application.rb
module MyApp
  class Application < Rails::Application
    config.force_ssl = false
  end
end

# config/environments/production.rb
MyApp::Application.configure do
  config.force_ssl = true
end

Rails <3.1 </strong>

На всякий случай, если у вас есть какие-либо проекты, которые не являются Rails 3.1 и которым нужна та же функция.Включите HTTPS, добавив следующую строку в конфигурацию вашей среды.

config.middleware.insert_before ActionDispatch::Static, "Rack::SSL"

Обратите внимание, что я передаю Rack::SSL в виде строки, чтобы делегировать загрузку класса в конце инициализации приложения Rails.Также обратите внимание, что промежуточное программное обеспечение должно быть вставлено в определенную позицию в стеке, по крайней мере до ActionDispatch::Static и ActionDispatch::Cookies.

Не забудьте определить зависимость Rack :: SSL в вашем Gemfile.

# Gemfile
gem 'rack-ssl', :require => 'rack/ssl'

Параллельное включение HTTPS и HTTP

Rack::SSL имеет очень интересную и недокументированную функцию.Вы можете передать опцию :exclude, чтобы определить, когда включать / отключать использование HTTPS.

Следующий код включает Rack::SSL и все его фильтры только в том случае, если запрос исходит от соединения HTTPS.

config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' }

Оба следующих URL будут работать, но первый вызовет фильтры Rack::SSL.

https://secure.example.comhttp://example.com

...