Heroku SSL в корневом домене - PullRequest
32 голосов
/ 15 июля 2011

Я пытаюсь настроить SSL для моего приложения heroku. Я использую надстройку SSL на основе имени хоста. Герою документации говорится следующее:

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 Zerigo поддерживает записи redirect . Я наткнулся на вопрос на похожую тему на 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

Мне интересно, есть ли лучшее решение для этого (за исключением переключения на 100 долларов США в месяц по IP-протоколу на основе IP)

Ответы [ 6 ]

39 голосов
/ 13 июня 2012

Ух ты ... это заняло у меня целую вечность, и куча информации в сети была неправильной. Даже документы Героку не указывали на то, что это возможно.

Но ответ Джеспера Дж дает подсказку в правильном направлении: он работает с записью ALIAS DNSimple, которая, как мне кажется, является новым видом записи DNS, которую они создали. Мне пришлось переключить свою службу DNS на них только для того, чтобы получить этот тип записи (ранее это было с EasyDNS).

Чтобы уточнить, когда я говорю «работает», я имею в виду:

  • весь сайт по SSL с использованием вашего корневого домена
  • нет предупреждений браузера
  • с использованием предложения Heroku Endpoint SSL ($ 20 / месяц)

Работает для всех следующих URL-адресов (перенаправляет их на https://foo.com без предупреждений)

Чтобы суммировать важные биты.

  1. перенести ваш DNS на DNSimple (если кто-то знает других провайдеров, предлагающих запись ALIAS, пожалуйста, опубликуйте их в комментариях, они были единственными, кого я смог найти)
  2. настроить конечную точку Heroku ssl как обычно https://devcenter.heroku.com/articles/ssl-endpoint
  3. Вернувшись в DNSimple, добавьте ALIAS запись, указывающую foo.com к вашей конечной точке heroku ssl, что-то вроде waterfall-9359.herokussl.com
  4. Также добавьте запись CNAME, указывающую www.foo.com на конечную точку вашего heroku ssl, waterfall-9359.herokussl.com
  5. Наконец, в вашем приложении rails (или в любом другом случае) выполните следующие настройки:

в 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. Мне было бы интересно узнать больше о том, как это работает, если кто-то знает, и насколько это надежно / зрело. Кажется, делает трюк, хотя.

8 голосов
/ 23 февраля 2012

DNSimple предлагает тип записи ALIAS для решения этой задачи. Вы можете создать псевдоним из своего корневого домена (a.k.a zone apex), указывающий на CNAME. Подробнее об этом здесь:

http://blog.dnsimple.com/introducing-the-alias-record/

1 голос
/ 18 августа 2014

В части Rails, чтобы сделать перенаправление, было бы более разумно сделать так, чтобы это происходило на уровне маршрутизатора, как это (работает на Rails 3+):

Rails.application.routes.draw do

  match '/*splat' => redirect { |_, request| request.url.sub('//www.', '//') }, :constraints => { :subdomain => 'www' }

  # ...

end
1 голос
/ 16 октября 2013

Вы должны иметь в виду, что Google может проиндексировать обе версии вашего сайта, если обе версии доступны (Root vs WWW). Вам потребуется настроить конусы для обработки того, что может быть затруднительно для обслуживания.

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

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

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

CNAME   www.foo.com 3600        providedsslendpoint.herokussl.com

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

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, что прекрасно работает для меня. Это также масштабируется для создания промежуточных или определенных сред.

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

1 голос
/ 15 июля 2011

DNS-перенаправления не заботятся о том, является ли входящий запрос http или https, поэтому будут поддерживать исходный протокол - так будет перенаправлять http://foo.com на http://www.foo.com и то же самое для https.

Вам нужно будет сделать это в приложении через найденный вами гем, или другой гем перенаправления стойки, или через www. проблема с использованием надстройки SSL на основе IP.

0 голосов
/ 28 июля 2017

Для тех пользователей heroku, которые ранее использовали godaddy, я просто заканчиваю перенос DNS с godaddy на cloudflare. И https работает нормально сейчас.

Godaddy DNS несовместим с герокой. И это связано с:

Некоторые провайдеры DNS предлагают записи A только для корневых доменов. К сожалению, записей A будет недостаточно для указания вашего корня домены Heroku, потому что они требуют статического IP. Эти записи имеют серьезные последствия доступности при использовании в таких средах, как локальные дата-центры, сервисы облачной инфраструктуры и платформы как Героку. Поскольку Heroku использует динамические IP-адреса, необходимо использовать запись типа CNAME (часто называемую записями ALIAS или ANAME) чтобы вы могли указать свой корневой домен на другой домен.

Настройка довольно проста.

Во-первых, добавьте серверы имен cloudflare в godaddy dns manager. Вот несколько примеров:

roxy.ns.cloudflare.com sam.ns.cloudflare.com

Далее вам нужно всего лишь два шага.

  1. Добавить CNAME NAME.com и связать его с NAME.com.herokudns.com
  2. Вот и все. Предполагается, что у вас уже есть CNAME www.NAME.com, связанная с www.NAME.com.herokudns.com

Если вы используете Rails, обязательно установите config.force_ssl = true на config/environment/production.rb

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...