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

StackOverflow https://stackoverflow.com/questions/327122

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

Вот код, чтобы пойти другим путем (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

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

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

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

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

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

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

другой:

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

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

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

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

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

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

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

ALIAS   foo.com 3600        providedsslendpoint.herokussl.com

Тогда я решил просто заменить foo.com с переменной env ENV['SITE_HOST'] (где SITE_HOST может быть равен www.foo.com или test.foo.com) таким образом, я могу управлять через свою конфигурацию heroku.Таким образом, я могу контролировать то, что происходит в разных средах.(для локальной настройки переменных 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.Старые ссылки будут немного зависать, но ничего заметного.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top