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

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 долларов США)

4b9b3361

Ответ 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