Перенаправить «myapp.com» на «www.myapp.com» в рельсах без использования htaccess? - PullRequest
27 голосов
/ 29 ноября 2008

Использование Appspace Morph Labs для развертывания сайта означает отсутствие автоматического способа перенаправления «myapp.com» на «www.myapp.com» (и отсутствие доступа к .htacess).

Есть ли способ сделать это в рельсах? Нужен ли мне плагин типа subdomain-fu ?

Точнее, я пытаюсь сделать что-то вроде:

  • 'myapp.com' => 'www.myapp.com'
  • 'myapp.com / session / new' => 'www.myapp.com/session/new'

По сути, я всегда хочу, чтобы субдомен «www» добавлялся перед каждым запросом (поскольку SSL-сертификат определенно имеет общее имя «www.myapp.com»).

Ответы [ 7 ]

30 голосов
/ 29 ноября 2008

Может быть, что-то вроде этого поможет:

class ApplicationController < ActionController::Base
  before_filter :check_uri

  def check_uri
    redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host)
  end
end
9 голосов
/ 13 ноября 2009

Ответ Карсона прекрасно работает.

Вот код, чтобы пойти другим путем (www -> нет www)

before_filter :check_uri

def check_uri
  if /^www/.match(request.host)
    redirect_to request.protocol + request.host_with_port[4..-1] + request.request_uri 
  end
end
5 голосов
/ 01 марта 2012

Мне пришлось изменить ответ Карсона, чтобы заставить его работать в Rails 3. Я заменил request.uri на request.fullpath:

class ApplicationController < ActionController::Base
  protect_from_forgery

  Rails.env.production? do
    before_filter :check_url
  end

  def check_url
    redirect_to request.protocol + "www." + request.host_with_port + request.fullpath if !/^www/.match(request.host)
  end
end
2 голосов
/ 28 июня 2010

Это прекрасно сработало для меня. Я сделал одно небольшое дополнение, так как хотел только такого поведения в своей производственной среде:

def check_uri
  redirect_to request.protocol + "www." + request.host_with_port + request.request_uri if !/^www/.match(request.host) if Rails.env == 'production'
end
1 голос
/ 26 июля 2010

Я знаю, что это ответ, но я думал, что все должны знать о решении CodeRack: Canonical Host. Это действительно хорошо, так как учитывает специфические перенаправления env. http://coderack.org/users/tylerhunt/middlewares/6-canonical-host

0 голосов
/ 16 октября 2013

Для тех из вас, кто хочет также использовать SSL с помощью heroku, это хорошо сработало для меня, на основе Heroku SSL для корневого домена

В настройках DNS я настроил запись URL / пересылки (DNS Simple)

URL foo.com     3600        http://www.foo.com

Настройка CNAME должна быть настроена только для WWW

CNAME   www.foo.com 3600        providedssslendpoint.herokussl.com

Мне также пришлось настроить и псевдоним для моего рута

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

Тогда я решил просто заменить foo.com на переменную env ENV['SITE_HOST'] (где SITE_HOST может равняться www.foo.com или test.foo.com), чтобы я мог управлять через свою героку конфигурации. Таким образом, я могу контролировать то, что происходит в разных средах. (для локальной настройки переменных env см. https://github.com/bkeepers/dotenv)

Например, мое тестовое приложение использует test.foo.com в качестве URL-адреса, к которому у него также есть собственная конечная точка SSL, поэтому он отлично работает для меня.

  before_filter :check_domain

  def check_domain
    if Rails.env.production? || Rails.env.testing? and request.host.downcase != ENV['SITE_HOST']
      redirect_to request.protocol + ENV['SITE_HOST'] + request.fullpath, :status => 301
    end
  end

Отныне конечные пользователи всегда будут иметь доступ к www с принудительным SSL. Старые ссылки будут немного зависать, но ничего не заметно.

0 голосов
/ 29 ноября 2008

Вот несколько способов:

 head :moved_permanently, :location => ‘http://www.newdomain.com’

другой

def rails_301
headers["Status"] = "301 Moved Permanently"
redirect_to "http://www.newdomain.com"
end 
...