Перенаправить 'myapp.com' на 'www.myapp.com' в rails без использования htaccess?
-
11-07-2019 - |
Вопрос
Использование 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.Старые ссылки будут немного зависать, но ничего заметного.