Jak przezwyciężyć ograniczenia CNAME domeny głównej?

Hostujemy wiele aplikacji internetowych dla naszych klientów. Jak jest oczywiste, chcą używać własnych domen, aby odnosić się do tych aplikacji, zwykle chcą, aby każdy użytkownik, który typuje http://www.customer1.example lub http://customer1.example, udał się do ich aplikacji internetowej.

Mamy do czynienia z sytuacją, w której musimy mieć elastyczność, aby zmienić adresy IP w najbliższej przyszłości. I nie chcemy polegać na tym, że klient dokonuje zmiany rekordu w swoich domenach. Więc pomyśleliśmy, że użycie CNAME rekordów będzie działa, ale jak się okaże CNAME rekordy nie będą działać dla domeny głównej.

W zasadzie:

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

Chcemy mieć możliwość zmiany adresu IP rekordu customer1.mycompanydomain.example lub rekordu A, a nasi klienci będą podążać za tym rekordem, nad którym mamy kontrolę.

W naszym DNS będzie to wyglądało następująco:

customer1.mycompanydomain.example IN A 192.0.2.1
Jakieś pomysły?
Author: Patrick Mevzek, 2009-03-18

8 answers

Powodem, dla którego to pytanie wciąż często się pojawia, jest to, że, jak wspomniałeś, gdzieś w jakiś sposób ktoś uznany za ważny napisał, że RFC podaje nazwy domen bez subdomeny przed nimi nie są poprawne. Jeśli jednak uważnie przeczytasz RFC, przekonasz się, że nie jest to dokładnie to, co mówi. W rzeczywistości RFC 1912 stwierdza:

Nie przesadzaj z CNAMEs. Używaj ich podczas zmiany nazwy hostów, ale planuj się ich pozbyć (i poinformuj swój użytkowników).

Niektóre hosty DNS zapewniają sposób na uzyskanie funkcji podobnej do CNAME na szczycie strefy (poziom domeny głównej, dla nagiej nazwy domeny) przy użyciu niestandardowego typu rekordu. Do takich zapisów należą na przykład:

  • ALIAS w DNSimple
  • ANAME w DNS Made Easy
  • ANAME w easyDNS
  • CNAME w CloudFlare

Dla każdego dostawcy konfiguracja jest podobna: wskaż alias lub wpis nazwy dla swojej domeny apex na example.domain.com, tak jak ty z rekordem CNAME. W zależności od dostawcy DNS wartość pusta lub @ Name identyfikuje wierzchołek strefy.

ALIAS lub ANAME lub @ example.domain.com.

Jeśli twój dostawca DNS nie obsługuje takiego typu rekordu i nie możesz przełączyć się na taki, który tak robi, musisz użyć przekierowania subdomeny, co nie jest takie trudne, w zależności od protokołu lub oprogramowania serwera, które musi to zrobić.

Zdecydowanie nie zgadzam się ze stwierdzeniem, że robi to tylko " amator adminów " lub takie pomysły. To proste "co musi zrobić nazwa i jej usługa?"deal, a następnie dostosować konfigurację DNS, aby służyć tym życzeniom; jeśli główne usługi są internetowe i e-mail, nie widzę żadnego ważnego powodu, dla którego porzucenie CNAMEs for-good byłoby problematyczne. Przecież kto woli @subdomain.domain.org over @domain.org ? Kto potrzebuje "www", jeśli masz już ustawiony sam protokół? Nielogiczne jest zakładanie, że użycie nazwy domeny głównej byłoby nieprawidłowe.

 51
Author: Meowing At The Moon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-10 00:22:30

CNAME ' używanie rekordu głównego nie jest technicznie sprzeczne z RFC, ale ma ograniczenia, co oznacza, że jest to praktyka, która nie jest zalecana.

Normalnie twój rekord root będzie miał wiele wpisów. Powiedzmy, 3 dla Twoich serwerów nazw i jeden dla adresu IP.

Per RFC:

Jeśli CNAME RR jest obecny w węźle, żadne inne dane nie powinny być present;

I zgodnie z dokumentem IETF "Common DNS Operational and Configuration Errors":

To często próbowany przez niedoświadczonych administratorów jako oczywisty sposób, aby Twoja nazwa domeny była również hostem. Jednak DNS serwery takie jak BIND zobaczą CNAME i odmówią dodania innych środki na to nazwisko. Ponieważ żadne inne zapisy nie są dozwolone coexist z CNAME, wpisy NS są ignorowane. Dlatego wszystkie gospodarze w podunk.domeny xx są również ignorowane!

Bibliografia:

 46
Author: Jon Swanson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-27 06:33:01

Nie wiem jak im to ujdzie na sucho, ani jakie mogą być ich negatywne skutki uboczne, ale używam Hover.com aby hostować niektóre z moich domen, a ostatnio skonfigurować wierzchołek mojej domeny jako CNAME. Ich narzędzie do edycji DNS w ogóle nie narzekało, a moja domena szczęśliwie rozwiązuje się za pomocą przypisanego CNAME.

Oto co wykop pokazuje mi dla tej domeny (faktyczna domena zaciemniona jako 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
 4
Author: Mason G. Zhwiti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-13 08:25:48

Musisz umieścić okres na końcu zewnętrznej domeny, więc nie wydaje ci się, że masz na myśli customer1. mycompanydomain.com. localdomain;

Więc po prostu zmień:

customer1.com IN CNAME customer1.mycompanydomain.com

Do

customer1.com IN CNAME customer1.mycompanydomain.com.
 4
Author: Gwerks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-23 17:30:30

Sipwiz jest poprawny jedynym sposobem, aby to zrobić poprawnie, jest podejście hybrydowe HTTP i DNS. Mój rejestrator jest odsprzedawcą Tucows i oferuje przekierowanie domeny głównej jako bezpłatną usługę o wartości dodanej.

Jeśli Twoja domena jest blah.com zapytają cię, gdzie chcesz przesłać domenę, a Ty wpisujesz www.blah.com. przypisują rekord A do swojego serwera apache i automatycznie dodają blah.com jako DNS vhost. Vhost odpowiada błędem HTTP 302 przekierowując je do właściwy adres URL. Jest prosty w skrypcie/konfiguracji i może być obsługiwany przez low end w przeciwnym razie byłby złomowany sprzęt.

Uruchom następujące polecenie dla przykładu: curl-v eclecticengineers.com

 3
Author: MrEvil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-18 04:43:58

Moja firma robi to samo dla wielu klientów, gdzie hostujemy dla nich stronę internetową, chociaż w naszym przypadku jest to xyz.company.com zamiast www.company.com / align = "left" / xyz.company.com aby wskazać adres IP przydzielamy je.

Co do tego, jak można poradzić sobie ze zmianą adresu IP, nie sądzę, aby było idealne rozwiązanie. Niektóre pomysły to:

  • Użyj NAT lub IP load balancer i podaj swoim klientom należący do niego adres IP. Jeśli adres IP serwera WWW wymaga zmiany, możesz zaktualizować NAT lub load balancer,

  • Oferuj również usługę hostingu DNS i przekonaj swoich klientów do hostowania swojej domeny, dzięki czemu będziesz w stanie zaktualizować rekordy A,

  • Poproś klientów o ustawienie rekordu A do jednego głównego serwera WWW i użyj przekierowania HTTP dla żądań internetowych każdego klienta.

 2
Author: sipwiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-03-18 03:27:50

Dzięki zarówno sipwiz i MrEvil. Opracowaliśmy skrypt PHP, który analizuje adres URL wprowadzany przez użytkownika i wkleja www do jego górnej części. (np. jeśli klient wejdzie kiragiannis.com , następnie przekieruje na www.kiragiannis.com ). tak więc nasz Klient wskaże swój root (np. customer1.com do A rekord, gdzie jest nasz przekierowanie www), a następnie www CNAME do prawdziwej płyty A zarządzanej przez nas.

Poniżej kodu w przypadku, gdy jesteś zainteresowany przyszłymi nami.

<?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}");
?>
 0
Author: Geo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-06 14:18:10

Widzę readytocloud.com jest hostowany na Apache 2.2.

Istnieje znacznie prostszy i bardziej efektywny sposób przekierowania strony nie-www do strony www w Apache.

Dodaj następujące reguły przepisywania do konfiguracji Apache (wewnątrz wirtualnego hosta lub na zewnątrz. To nie ma znaczenia):

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

Lub następujące reguły przepisywania, jeśli chcesz odwzorować adresy URL 1 do 1 ze strony nie-www na stronę www:

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

Uwaga, moduł mod_rewrite musi być załadowany do tego do pracy. Na szczęście readytocloud.com działa na skrzynce CentOS, która domyślnie ładuje mod_rewrite.

Mamy serwer klienta z Apache 2.2 z prawie 3000 domen i prawie 4000 przekierowań, jednak obciążenie serwera wynosi około 0.10-0.20.

 0
Author: Owen Blacker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-06 14:19:04