Подтвердить что ты не робот

Перенаправить "myapp.com" на "www.myapp.com" в рельсах без использования htaccess?

Использование приложения 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" ).

4b9b3361

Ответ 1

Возможно, что-то вроде этого сделает трюк:

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

Ответ 2

Ответ Карсона отлично работает.

Здесь код для перехода в другую сторону (www → no 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

Ответ 3

Мне пришлось изменить ответ Карсона, чтобы заставить его работать в 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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Вот несколько разных способов:

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

другой:

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

Ответ 7

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

В моих настройках DNS я установил URL/Forward-запись (DNS Simple)

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

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

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

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

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. Старые ссылки будут страдать от небольшой зависания, но ничего заметного.