Как преодолеть ограничения корневого домена CNAME? - PullRequest
110 голосов
/ 18 марта 2009

Мы размещаем множество веб-приложений для наших клиентов. Очевидно, что они хотят использовать свои собственные домены для ссылки на эти приложения, обычно они хотят, чтобы любой пользователь, который набрал http://www.customer1.example или http://customer1.example, пошел в свое веб-приложение.

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

В основном:

customer1.example IN CNAME customer1.mycompanydomain.example //this is invalid as the RFC
www.customer1.example IN CNAME customer1.mycompanydomain.example //this is valid and will work

Мы хотим иметь возможность изменить IP-адрес customer1.mycompanydomain.example или запись A, и наши клиенты будут следовать этой записи, которую мы контролируем.

в нашем DNS это будет выглядеть так:

customer1.mycompanydomain.example IN A 192.0.2.1

Есть идеи?

Ответы [ 8 ]

56 голосов
/ 26 марта 2014

Причина, по которой этот вопрос все еще часто возникает, заключается в том, что, как вы упомянули, где-то кто-то как-то считал важным, что RFC утверждает, что доменные имена без поддоменов перед ними недопустимы. Однако, если вы внимательно прочитаете RFC, вы поймете, что это не совсем то, что написано. Фактически, RFC 1912 заявляет:

Не переусердствуйте с CNAME. Используйте их при переименовании хостов, но планируйте избавиться от них (и проинформируйте своих пользователей).

Некоторые DNS-хосты предоставляют способ получить CNAME-подобные функциональные возможности на вершине зоны (уровень корневого домена, для открытого имени домена), используя пользовательский тип записи. Такие записи включают, например:

  • ALIAS в DNSimple
  • ИМЯ на DNS Made Easy
  • ИМЯ на easyDNS
  • CNAME в CloudFlare

Настройка для каждого провайдера аналогична: укажите запись ALIAS или ANAME для вашего домена apex на example.domain.com, так же, как при записи CNAME. В зависимости от провайдера DNS, пустое значение или значение @ Name определяет вершину зоны.

ALIAS или ANAME или @ example.domain.com.

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

Я категорически не согласен с утверждением, что это делают только "любители-администраторы" или подобные идеи. Это просто "Что нужно сделать имени и его сервису?" разобраться, а затем адаптировать свой DNS-конфигурацию для удовлетворения этих пожеланий; Если вашими основными услугами являются Интернет и электронная почта, я не вижу никаких ДЕЙСТВИТЕЛЬНЫХ причин, по которым удаление CNAME навсегда было бы проблематичным. В конце концов, кто предпочел бы @ subdomain.domain.org над @ domain.org? Кому нужен "www", если вы уже настроили сам протокол? Нелогично предполагать, что использование имени корневого домена будет недопустимым.

47 голосов
/ 17 апреля 2009

CNAME'инг корневой записи технически не соответствует RFC, но имеет ограничения, означающие, что это практика, которая не рекомендуется.

Обычно ваша корневая запись будет иметь несколько записей. Скажем, 3 для ваших серверов имен, а затем один для IP-адреса.

По RFC:

Если в узле присутствует CNAME RR, никакие другие данные не должны присутствует;

И согласно IETF «Общие ошибки при работе и конфигурации DNS»:

Это часто делают неопытные администраторы как очевидное способ позволить вашему доменному имени также быть хостом. Тем не менее, DNS серверы типа BIND увидят CNAME и откажутся добавлять любые другие ресурсы для этого имени. Поскольку никакие другие записи не разрешены сосуществовать с CNAME, записи NS игнорируются. Поэтому все хосты в домене podunk.xx также игнорируются!

Ссылки:

4 голосов
/ 13 февраля 2014

Я не знаю, как им это сходит с рук, или какие могут быть их негативные побочные эффекты, но я использую Hover.com для размещения некоторых своих доменов, и недавно установил вершину моего домена CNAME там. Их инструмент редактирования DNS вообще не жаловался, и мой домен успешно обрабатывается с помощью назначенного CNAME.

Вот что Dig показывает мне для этого домена (фактический домен скрыт как mydomain.com):

; <<>> DiG 9.8.3-P1 <<>> mydomain.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2056
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;mydomain.com.          IN  A

;; ANSWER SECTION:
mydomain.com.       394 IN  CNAME   myapp.parseapp.com.
myapp.parseapp.com. 300 IN  CNAME   parseapp.com.
parseapp.com.       60  IN  A   54.243.93.102
3 голосов
/ 23 февраля 2014

Вы должны поставить точку в конце внешнего домена, чтобы она не думала, что вы имеете в виду customer1.mycompanydomain.com.localdomain;

Так что просто измените:

customer1.com IN CNAME customer1.mycompanydomain.com

К

customer1.com IN CNAME customer1.mycompanydomain.com.
3 голосов
/ 18 марта 2009

Sipwiz верен, единственный способ сделать это правильно - это гибридный подход HTTP и DNS. Мой регистратор является перепродавцом для Tucows, и они предлагают переадресацию корневого домена в качестве бесплатной услуги с добавленной стоимостью.

Если ваш домен blah.com, вас спросят, куда вы хотите переадресовать домен, и вы введете www.blah.com. Они назначают запись A своему серверу apache и автоматически добавляют blah.com в качестве DNS-хоста. Vhost отвечает с ошибкой HTTP 302, перенаправляя их на правильный URL. Он прост в сценарии / настройке и может быть обработан нижним пределом, в противном случае это будет слом аппаратным обеспечением.

Запустите следующую команду для примера: curl -v eclecticengineers.com

2 голосов
/ 18 марта 2009

Моя компания делает то же самое для ряда клиентов, для которых мы размещаем веб-сайт для них, хотя в нашем случае это xyz.company.com, а не www.company.com. Мы заставляем их установить запись A на xyz.company.com, чтобы указать IP-адрес, который мы им присвоили.

Что касается того, как вы могли бы справиться с изменением IP-адреса, я не думаю, что есть идеальное решение. Вот некоторые идеи:

  • Используйте балансировщик нагрузки NAT или IP и предоставьте своим клиентам принадлежащий ему IP-адрес. Если необходимо изменить IP-адрес веб-сервера, вы можете обновить NAT или балансировщик нагрузки,

  • Предложите услугу хостинга DNS и попросите своих клиентов разместить у вас свой домен, чтобы иметь возможность обновлять записи A,

  • Пусть ваши клиенты установят свои записи A на один основной веб-сервер и будут использовать перенаправление HTTP для веб-запросов каждого клиента.

0 голосов
/ 18 июня 2009

Я вижу, что readytocloud.com размещен на Apache 2.2.

Существует гораздо более простой и эффективный способ перенаправления сайта без www на сайт www в Apache.

Добавьте следующие правила перезаписи в конфиги Apache (внутри виртуального хоста или снаружи. Это не имеет значения):

RewriteCond %{HTTP_HOST} ^readytocloud.com [NC]
RewriteRule ^/$ http://www.readytocloud.com/ [R=301,L]

Или следующие правила перезаписи, если требуется сопоставление URL-адресов 1-к-1 с сайта без www на сайт www:

RewriteCond %{HTTP_HOST} ^readytocloud.com [NC]
RewriteRule (.*) http://www.readytocloud.com$1 [R=301,L]

Обратите внимание, модуль mod_rewrite должен быть загружен, чтобы это работало. К счастью, readytocloud.com работает на компьютере CentOS, который по умолчанию загружает mod_rewrite.

У нас есть клиентский сервер под управлением Apache 2.2 с чуть менее 3000 доменов и почти 4000 перенаправлений, однако нагрузка на сервер колеблется около 0,10 - 0,20.

0 голосов
/ 20 марта 2009

Спасибо как sipwiz, так и MrEvil. Мы разработали PHP-скрипт, который будет анализировать URL-адрес, который вводит пользователь, и вставлять www в его верхнюю часть. (например, если клиент вводит kiragiannis.com , он будет перенаправлен на www.kiragiannis.com ). Таким образом, наши клиенты указывают свои корни (например, customer1.com на A запись о том, где находится наш веб-перенаправитель), а затем www CNAME на действительную A запись, которой мы управляем.

Ниже кода, если вы заинтересованы в будущем нас.

<?php
$url = strtolower($_SERVER["HTTP_HOST"]);

if(strpos($url, "//") !== false) { // remove http://
  $url = substr($url, strpos($url, "//") + 2);
}

$urlPagePath = "";
if(strpos($url, "/") !== false) { // store post-domain page path to append later
  $urlPagePath = substr($url, strpos($url, "/"));
  $url = substr($url, 0, strpos($url,"/"));
}


$urlLast = substr($url, strrpos($url, "."));
$url = substr($url, 0, strrpos($url, "."));


if(strpos($url, ".") !== false) { // get rid of subdomain(s)
  $url = substr($url, strrpos($url, ".") + 1);
}


$url = "http://www." . $url . $urlLast . $urlPagePath;

header( "Location:{$url}");
?>
...