Heroku SSL в корневом домене
Я пытаюсь настроить SSL для своего приложения heroku. Я использую надстройку SSL на основе имени хоста. В документации heroku указано следующее:
Hostname based SSL will not work with root domains as it relies on CNAME
aliasing of your custom domain names. CNAME aliasing of root domains is
an RFC violation.
Как и ожидалось, все работает хорошо, когда я обращаюсь к сайту с использованием субдомена www, то есть https://www.foo.com. Браузер жалуется, когда я обращаюсь к https://foo.com, поскольку представленный сертификат предназначен для heroku.com.
Я пришел к выводу, что мне нужно перенаправить трафик для foo.com на сайт www.foo.com для решения этой проблемы. Я рассматриваю следующие подходы:
1) Перенаправление DNS на основе DNS
Поставщик DNS Zerigo поддерживает записи переадресации. Я встретил question по аналогичной теме на SO. Я попробовал решение, он работает ТОЛЬКО для перенаправления HTTP (документация по Zerigo подтверждает это).
Конфигурация моего Zerigo:
foo.com A x.x.x.x
foo.com redirect http://www.foo.com
www.foo.com CNAME zzz.amazonaws.com
2) Перенаправление на стойке
Добавьте промежуточное программное обеспечение на стойке, чтобы выполнить перенаправление. canonical-host gem предоставляет такую поддержку.
use CanonicalHost do
case Rails.env.to_sym
when :staging then 'staging.foo.com'
when :production then 'www.foo.com'
end
end
Мне интересно, есть ли лучшее решение для этого (запрет на переключение на SSL на основе протокола IP на 100 долларов США)
Ответы
Ответ 1
Вау... это заняло меня навсегда, и куча информации в Интернете была неправильной. Даже документы Heroku, похоже, не указывают на то, что это возможно.
Но ответ Jesper J дает подсказку в правильном направлении: он работает с записью DNSimple ALIAS, которая, я думаю, представляет собой новый тип записи DNS, которую они создали. Я должен был переключить свою службу DNS на них, чтобы получить этот тип записи (ранее был с EasyDNS).
Чтобы пояснить, когда я говорю "работает", я имею в виду:
- весь сайт на SSL с использованием корневого домена
- никаких предупреждений браузера
- с использованием предложения Heroku Endpoint SSL ($ 20/month)
Он работает для всех следующих URL-адресов (перенаправляет их на https://foo.com без предупреждений)
Подводя итог важным битам.
- переместите DNS на DNSimple (если кто-нибудь знает других поставщиков, предлагающих запись ALIAS, разместите их в комментариях, они были единственными, которые я смог найти)
- настройка конечной точки Heroku ssl как обычно https://devcenter.heroku.com/articles/ssl-endpoint
- Вернуться в DNSimple добавьте
ALIAS
запись, указывающую foo.com
в вашу конечную точку ssl героя, что-то вроде waterfall-9359.herokussl.com
- Также добавьте запись CNAME, указывающую
www.foo.com
на конечную точку вашего героя ssl, waterfall-9359.herokussl.com
- Наконец, в вашем рельсе (или любом другом) приложении сделайте следующие настройки:
в production.rb
установить
config.force_ssl = true
в application_controller.rb
добавить
before_filter :check_domain
def check_domain
if Rails.env.production? and request.host.downcase != 'foo.com'
redirect_to request.protocol + 'foo.com' + request.fullpath, :status => 301
end
end
Это, похоже, работает! Ключевым элементом является запись ALIAS
dns. Мне было бы интересно узнать больше о том, как это работает, если кто знает, и насколько он надежный/зрелый. Кажется, сделать трюк, хотя.
Ответ 2
DNSimple предлагает тип записи ALIAS для решения этой проблемы. Вы можете создать псевдоним из корневого домена (вершина зоны a.k.a), указывающего на CNAME. Подробнее об этом читайте здесь:
http://blog.dnsimple.com/introducing-the-alias-record/
Ответ 3
Переадресации DNS не волнует, будет ли входящий запрос http или https таким образом поддерживать исходный протокол - так что перенаправит http://foo.com в http://www.foo.com и то же самое для https.
Вам нужно будет сделать это в приложении через найденный вами драгоценный камень или какой-нибудь другой редирект для переименования или www. проблема связана с использованием SSL-аддонов на основе IP.
Ответ 4
Одна вещь, которую вы хотите иметь в виду: Google может индексировать обе версии вашего сайта, если доступны обе версии (Root vs WWW). Вам нужно будет настроить конические инструменты, чтобы справиться с тем, что может быть больно для поддержания.
В моих настройках DNS я установил URL/Forward-запись (DNS Simple)
URL foo.com 3600 http://www.foo.com
Настройка CNAME должна быть настроена только для WWW
CNAME www.foo.com 3600 providedsslendpoint.herokussl.com
Мне также пришлось настроить и Alias для моего корня
ALIAS foo.com 3600 providedsslendpoint.herokussl.com
Затем я решил просто заменить foo.com на переменную env ENV['SITE_HOST']
(где SITE_HOST = www.foo.com или что бы я мог определить). Я могу контролировать это через мою конфигурацию heroku или мой .ENV файл (см. https://github.com/bkeepers/dotenv). Таким образом, я могу контролировать, что происходит в разных средах.
Например, мое тестовое приложение использует test.foo.com, поскольку URL-адрес также имеет свою собственную конечную точку SSL, так что это отлично работает для меня. Это также масштабируется для создания промежуточных или qa-специфических сред.
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. Старые ссылки будут страдать от небольшой зависания, но ничего заметного.
Ответ 5
В части Rails, чтобы сделать перенаправление, было бы более разумно сделать это на уровне маршрутизатора, как это (работает с Rails 3 +):
Rails.application.routes.draw do
match '/*splat' => redirect { |_, request| request.url.sub('//www.', '//') }, :constraints => { :subdomain => 'www' }
# ...
end
Ответ 6
Для тех пользователей heroku, которые использовали godaddy ранее, я просто закончу перенос DNS с godaddy на cloudflare. И https теперь работает нормально.
Godaddy DNS несовместим с героикой. И это связано с:
Некоторые поставщики DNS будут предлагать только записи A для корневых доменов. К сожалению, записей A недостаточно для указания вашего корня доменов в Heroku, поскольку они требуют статического IP-адреса. Эти записи серьезные последствия при использовании в таких средах, как локальные дата-центры, услуги облачной инфраструктуры и платформы как Героку. Поскольку Heroku использует динамические IP-адреса, необходимо используйте запись CNAME (часто называемую записями ALIAS или ANAME) так что вы можете указать свой корневой домен на другой домен.
Настройка довольно проста.
Во-первых, добавьте серверы имен облачного флекса в godddy dns manager. Вот несколько примеров:
roxy.ns.cloudflare.com sam.ns.cloudflare.com
Далее вам нужно еще два шага.
- Добавьте CNAME
NAME.com
и привяжите его к NAME.com.herokudns.com
- Что это. Предполагается, что у вас уже есть CNAME
www.NAME.com
, связанный с www.NAME.com.herokudns.com
Если вы используете Rails, обязательно установите config.force_ssl = true
в config/environment/production.rb