Как мне настроить DNS для верхнего домена (без www), указывающего на приложение Heroku?

97

Я уже добавил собственный домен в свое приложение Heroku, и он работает с www.domain.com.

Мне нужно знать, как настроить домен без wwwразрешения приложения.

Вот мои текущие настройки DNS:

$TTL 86400
@   IN SOA ns1.first-ns.de. postmaster.robot.first-ns.de. (
    2013041500   ; serial
    14400        ; refresh
    1800         ; retry
    604800       ; expire
    86400 )      ; minimum

@                        IN NS      robotns3.second-ns.com.
@                        IN NS      robotns2.second-ns.de.
@                        IN NS      ns1.first-ns.de.

@                        IN A       88.198.38.XXX
localhost                IN A       127.0.0.1
mail                     IN A       88.198.38.XXX
ftp                      IN CNAME   www
imap                     IN CNAME   www
loopback                 IN CNAME   localhost
pop                      IN CNAME   www
relay                    IN CNAME   www
smtp                     IN CNAME   www
www                      IN CNAME   appname.herokuapp.com.
@                        IN MX 10   mail

Какие настройки следует использовать, чтобы оба example.comи www.example.comправильно указывали на мое приложение Heroku?

MRKS
источник
Кстати, похоже, что ваши настройки ftp / pop / smtp неверны, поскольку он указывает на www, что указывает на heroku, который не выполняет ftp / pop / smtp.
kch
Другое решение stackoverflow.com/a/11494197/176877
Крис Москини

Ответы:

145

(Примечание: корневые, базовые и верхние домены - это одно и то же. Используются взаимозаменяемо для google-foo.)

Традиционно, чтобы указать свой домен вершины, вы должны использовать запись A, указывающую на IP-адрес вашего сервера. Это решение не масштабируется и не является жизнеспособным для облачной платформы, такой как Heroku, где несколько и часто меняющиеся серверные части отвечают за ответы на запросы.

Для поддоменов (например, www.example.com) вы можете использовать записи CNAME, указывающие на your-app-name.herokuapp.com. С этого момента Heroku управляет динамическими записями A, your-app-name.herokuapp.comчтобы они всегда были актуальными. К сожалению, спецификация DNS не разрешает записи CNAME на вершине зоны (базовом домене). (Например, записи MX будут прерваны, поскольку CNAME сначала будет следовать к своей цели.)

Возвращаясь к корневым доменам, простое и универсальное решение - вообще не использовать их. В качестве запасной меры некоторые поставщики DNS предлагают настроить для вас перенаправление HTTP. В этом случае настройте его так, чтобы example.comэто HTTP-перенаправление на www.example.com.

Некоторые поставщики DNS предложили собственные решения, которые позволяют вести себя как CNAME на вершине зоны. Насколько мне известно, у нас есть ALIAS запись DNSimple в и ANAME запись DNS Made Easy в ; оба ведут себя одинаково.

Используя их, вы можете настроить свои записи как (используя нотацию файловых зон, даже если вы, вероятно, сделаете это в их пользовательском веб-интерфейсе):

@   IN ALIAS your-app-name.herokuapp.com.
www IN CNAME your-app-name.herokuapp.com.

Помните, @что это сокращение для корневого домена ( example.com). Также учтите, что конечные точки важны как в файлах зон, так и в некоторых пользовательских веб-интерфейсах.

Смотрите также:

Примечания:

  • Amazon Route 53 также имеет тип записи ALIAS, но он несколько ограничен, поскольку работает только для указания точки в AWS. На данный момент я бы не рекомендовал использовать это для настройки Heroku.

  • Некоторые люди путают поставщиков DNS с регистраторами доменных имен, поскольку компании, предлагающие и то, и другое, частично совпадают. Имейте в виду, что для переключения вашего DNS-сервера на одного из вышеупомянутых провайдеров вам нужно только обновить записи своего сервера имен с помощью вашего текущего регистратора домена. Переносить регистрацию домена не нужно.

кч
источник
1
Также см . Центр разработки Heroku
Джон Маунтджой
3
+1 за упоминание dnsimple. Их усилия по упрощению работы с поставщиками облачных услуг стали важным фактором в моем решении перейти на них.
Subfuzion
1
@kch знаете ли вы, как я могу создать тип записи DNS, который ведет себя как ALIAS DNSimple в BIND?
wlf
1
Не думаю, что сможешь. Это особенность.
kch
2
CloudFlare также предоставляет эти функции посредством того, что они называют уплощением CNAME . Они автоматически делают это для записей CNAME, которые вы создаете в корне, но они включат это для всей вашей зоны для всех записей CNAME, если вы свяжетесь с ними и попросите об этом.
Адриан Фрювирт
4

Чтобы указать свой верхний / корневой / голый домен на приложение, размещенное на Heroku, вам понадобится DNS-провайдер, который поддерживает записи, подобные CNAME (часто называемые записями ALIAS или ANAME). В настоящее время Heroku рекомендует :

Какой бы из них вы ни выбрали, ваша запись будет выглядеть следующим образом:

Запись: ALIAS илиANAME

Имя: пусто или@

Цель: example.com.herokudns.com.

Это все, что вам нужно.


Однако для SEO нецелесообразно разрешать и версию с www, и версию без www. Один должен указывать на другой как на канонический URL. Как вы решите это сделать, зависит от того, используете ли вы HTTPS или нет. А если нет, то вам, вероятно, следует поступить так, как Heroku теперь автоматически и бесплатно обрабатывает SSL-сертификаты для всех приложений, работающих на платных динамометрических станциях.

Если вы не используете HTTPS, вы можете просто создать 301 Redirect запись с большинством провайдеров DNS , указывающими имя wwwв http://example.com.

Если будут с помощью HTTPS, вы , скорее всего , нужно обрабатывать перенаправление на уровне приложения. Если вы хотите знать, почему, ознакомьтесь с этими короткими и длинными объяснениями, но в основном, поскольку ваш DNS-провайдер или другая служба переадресации URL-адресов не имеет и не должна иметь вашего сертификата SSL и закрытого ключа, они не могут отвечать на HTTPS. запросы для вашего домена.

Чтобы обрабатывать перенаправления на уровне приложения, вам необходимо:

  • Добавьте имена хостов apex и www в приложение Heroku ( heroku domains:add example.comи heroku domains:add www.example.com)
  • Настройте свои сертификаты SSL
  • Направьте свою запись домена вершины на Heroku, используя запись ALIAS или ANAME, как описано выше.
  • Добавьте запись CNAME с именем, wwwуказывающим наwww.example.com.herokudns.com.
  • А затем в вашем приложении 301 перенаправляет любые запросы www на URL без www ( вот пример того, как это сделать в Django)
  • Также в вашем приложении вам, вероятно, следует перенаправить любые HTTP-запросы на HTTPS (например, в Django установлено SECURE_SSL_REDIRECTзначение True)

Проверьте этот пост от DNSimple больше.

Джефф Боуэн
источник
3

Сейчас я использую Google Apps (для электронной почты) и Heroku в качестве веб-сервера. Я использую функцию постоянного перенаправления Google Apps 301 для перенаправления голого домена на WWW.your_domain.com

Вы можете найти пошаговые инструкции здесь https://stackoverflow.com/a/20115583/1440255

Лев Тюльпан
источник
2

Вам не разрешено иметь запись CNAME для домена, поскольку CNAME - это функция псевдонима, которая охватывает все типы данных (независимо от того, ищет ли клиент записи MX, NS или SOA). CNAME также всегда ссылаются на новое имя, а не на IP-адрес, поэтому на самом деле в одной строке есть две ошибки.

@                        IN CNAME   88.198.38.XXX

Изменение этого CNAME на запись A должно заставить его работать, при условии, что используемый вами ip-адрес является правильным для вашего приложения Heroku.

Единственный правильный способ в DNS заставить простое domain.comимя работать в браузере - это указать домену на IP-адрес с записью A.

Криску
источник
Хорошо, но как я могу узнать свой IP? Через хост appname.herokuapp.com/www.domain.com я просто получаю такой IP: 107.20.162.205 (такого приложения на Heroku нет)
mrks
1
Этот IP-адрес и нужно использовать. Вы просто не можете протестировать в браузере с IP-адресом, потому что Heroku нужно знать имя приложения, которое вы пытаетесь использовать. Просто настройте запись A в DNS и проверьте с помощью than, и Heroku увидит имя, которое вы используете, и все должно быть в порядке!
krisku
Хорошо, но я каждый раз получаю другой IP после "host appname.herokuapp.com".
mrks
2
host app-name.herokuapp.comрезультаты динамичны. Если вы их жестко закодируете, ваше приложение в конечном итоге остановится. См. Рекомендуемые решения ANAME / CNAME в другом комментарии.
kch
1
Вам нужен веб-сервер с неизменяемым IP-адресом, который может выполнять HTTP-перенаправление с domain.com -> www.domain.com и указывать domain.com на этот IP-адрес. Затем вы можете указать CNAME для www.domain.com на настоящее приложение heroku.
krisku