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 Zerigo поддерживает записи переадресации . Я столкнулся с вопросом по подобной теме на SO. Я попробовал решение, он работает ТОЛЬКО для перенаправления HTTP (документация по Zerigo подтверждает это).

Моя конфигурация Zerigo:

 foo.com A xxxx foo.com redirect http://www.foo.com www.foo.com CNAME zzz.amazonaws.com 

2) Перенаправление на стойке

Добавьте промежуточное программное обеспечение на стойке, чтобы выполнить redirect. Каноническая жемчужина обеспечивает такую ​​поддержку.

 use CanonicalHost do case Rails.env.to_sym when :staging then 'staging.foo.com' when :production then 'www.foo.com' end end 

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

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

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

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

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

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

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

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

в комплекте production.rb

 config.force_ssl = true 

в application_controller.rb add

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

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

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

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

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

Одна вещь, которую вы хотите иметь в виду: 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 ​​для моего корня

 ALIAS foo.com 3600 providedsslendpoint.herokussl.com 

Затем я решил просто заменить foo.com на переменную env ENV['SITE_HOST'] (где SITE_HOST = http://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. Старые ссылки будут страдать от небольшой зависания, но ничего заметного.

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

 Rails.application.routes.draw do match '/*splat' => redirect { |_, request| request.url.sub('//www.', '//') }, :constraints => { :subdomain => 'www' } # ... end 

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

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

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

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

Во-первых, добавьте серверы имен облачного флекса в менеджер Godddy dns. Вот несколько примеров:

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

DNS Made Easy также предлагает тип записи ALIAS. В настоящее время я использую их с Heroku.

DNS Made Easy ANAME Record Tutorial: http://help.dnsmadeeasy.com/managed-dns/records/aname-records/

  • Что такое Keystore?
  • Dyld: библиотека не загружена: /usr/lib/libcurl.4.dylib curl Ошибка SSL
  • Использование CERT Tapioca на VM
  • Заставить браузер загружать «https» версию веб-сайта, а не «http»?
  • Подписанный SSL-сертификат третьей стороны для localhost или 127.0.0.1?
  • Проблемы с подключением через HTTPS / SSL через собственный клиент Java
  • Как включить поддержку TLS 1.2 в Android-приложении (работает на Android 4.1 JB)
  • Как игнорировать создание пути PKIX не удалось: sun.security.provider.certpath.SunCertPathBuilderException?
  • Apache HttpClient на Android, производящем CertPathValidatorException (имя_отчета! = Имя_почты)
  • Подтверждения IPN PayPal IPN с использованием процедур SSL: SSL3_READ_BYTES: сбой вызова подтверждения sslv3
  • Простой Java HTTPS-сервер
  • Interesting Posts

    Отображение изображения из базы данных в asp mvc

    Можно ли фильтровать адреса в поле CC, но не в поле TO?

    Как измерить, как долго работает функция?

    Каков самый чистый способ написать формулу массива, чтобы облегчить добавление большего количества строк?

    Медленный компьютер на зарядном устройстве низкой мощности

    У кого-нибудь есть опыт работы с батареями для ноутбуков?

    Использование «display: table-cell» есть способ получить функциональность «colspan»?

    Разрешения для папки IIS7 для веб-приложения

    Скрыть адрес электронной почты отправителя при отправке от имени

    Какова ошибка, сообщаемая для AH01757, «генерирующая секрет для аутентификации дайджеста …»?

    Android – Получить время виджета хронометра

    Использование WebView setHttpAuthUsernamePassword?

    Как я могу создать решение программно на C #?

    Не удалось подключиться к службе камеры

    Джерси ClientResponse.getEntity общего типа

    Давайте будем гением компьютера.