Wie richte ich DNS für eine Apex-Domain (kein WWW) ein, die auf eine Heroku-App verweist?

97

Ich habe meiner Heroku-App bereits eine benutzerdefinierte Domain hinzugefügt, mit der es funktioniert www.domain.com.

Ich muss wissen, wie man die Domain einrichtet, ohne wwwsie auch in die App aufzulösen.

Hier sind meine aktuellen DNS-Einstellungen:

$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

Was sind die richtigen Einstellungen, damit beide example.comund www.example.comkorrekt auf meine Heroku-App verweisen?

mrks
quelle
Übrigens sieht es so aus, als ob Ihre FTP / Pop / SMTP-Einstellungen alle falsch sind, da sie auf www verweisen, was auf Heroku verweist, die kein FTP / Pop / SMTP ausführen.
kch
Eine andere Lösung stackoverflow.com/a/11494197/176877
Chris Moschini

Antworten:

145

(Hinweis: Root-, Base- und Apex-Domains sind alle gleich. Austauschbar für Google-Foo.)

Um auf Ihre Apex-Domain zu verweisen, verwenden Sie normalerweise einen A-Datensatz, der auf die IP Ihres Servers verweist. Diese Lösung lässt sich nicht skalieren und ist für eine Cloud-Plattform wie Heroku nicht geeignet, bei der mehrere und häufig wechselnde Backends für die Beantwortung von Anfragen verantwortlich sind.

Für Subdomains (wie www.example.com) können Sie CNAME-Datensätze verwenden, auf die verwiesen wird your-app-name.herokuapp.com. Von da an verwaltet Heroku die dahinter stehenden dynamischen A-Datensätze your-app-name.herokuapp.comso, dass sie immer auf dem neuesten Stand sind. Leider erlaubt die DNS-Spezifikation keine CNAME-Einträge auf der Zonenspitze (der Basisdomäne). (Zum Beispiel würden MX-Datensätze brechen, wenn der CNAME zuerst seinem Ziel folgt.)

Zurück zu den Stammdomänen besteht die einfache und generische Lösung darin, sie überhaupt nicht zu verwenden. Als Fallback-Maßnahme bieten einige DNS-Anbieter an, eine HTTP-Umleitung für Sie einzurichten. Richten Sie es in diesem Fall so ein, dass example.comeine HTTP-Umleitung zu erfolgt www.example.com.

Einige DNS-Anbieter haben benutzerdefinierte Lösungen entwickelt, die ein CNAME-ähnliches Verhalten auf der Zonenspitze ermöglichen. Meines Wissens haben wir den ALIAS-Eintrag von DNSimple und den ANAME-Eintrag von DNS Made Easy . beide verhalten sich ähnlich.

Mit diesen können Sie Ihre Datensätze wie folgt einrichten (mithilfe der Zonendatei-Notation, obwohl Sie dies wahrscheinlich auf der Webbenutzeroberfläche tun werden):

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

Denken Sie daran, @hier ist eine Abkürzung für die Root-Domain ( example.com). Beachten Sie auch, dass die nachfolgenden Punkte sowohl in Zonendateien als auch in einigen Webbenutzeroberflächen wichtig sind.

Siehe auch:

Bemerkungen:

  • Die Route 53 von Amazon verfügt ebenfalls über einen ALIAS-Datensatztyp, der jedoch insofern etwas eingeschränkt ist, als er nur auf AWS verweist. Im Moment würde ich nicht empfehlen, dies für ein Heroku-Setup zu verwenden.

  • Einige Leute verwechseln DNS-Anbieter mit Domainnamen-Registraren, da es einige Überschneidungen mit Unternehmen gibt, die beides anbieten. Beachten Sie jedoch, dass Sie zum Umschalten Ihres DNS auf einen der oben genannten Anbieter nur Ihre Nameserver-Einträge mit Ihrem aktuellen Domain-Registrar aktualisieren müssen. Sie müssen Ihre Domain-Registrierung nicht übertragen.

kch
quelle
1
Siehe auch Herokus Dev Center
Jon Mountjoy
3
+1 für die Erwähnung von dnsimple. Ihre Bemühungen, die Zusammenarbeit mit Cloud-Anbietern zu vereinfachen, waren ein wichtiger Faktor für meine Entscheidung, zu ihnen zu wechseln.
Subfuzion
1
@kch wissen Sie, wie ich einen DNS-Eintragstyp erstellen kann, der sich wie DNSIMS ALIAS in BIND verhält?
wlf
1
Glaube nicht, dass du kannst. Es ist eine benutzerdefinierte Funktion.
kch
2
CloudFlare bietet diese Funktionen auch durch die sogenannte CNAME-Reduzierung . Sie tun dies automatisch für CNAME-Datensätze, die Sie im Stammverzeichnis erstellen. Sie aktivieren es jedoch in Ihrer gesamten Zone für alle CNAME-Datensätze, wenn Sie sich mit ihnen in Verbindung setzen und danach fragen.
Adrian Frühwirth
4

Um Ihre Apex- / Root- / Naked-Domain auf eine von Heroku gehostete Anwendung zu verweisen, müssen Sie einen DNS-Anbieter verwenden, der CNAME-ähnliche Einträge unterstützt (häufig als ALIAS- oder ANAME-Einträge bezeichnet). Derzeit empfiehlt Heroku :

Unabhängig davon, welche von Ihnen Sie auswählen, sieht Ihre Aufzeichnung wie folgt aus:

Aufzeichnung: ALIAS oderANAME

Name: leer oder@

Ziel: example.com.herokudns.com.

Das ist alles was du brauchst.


Es ist jedoch nicht gut für SEO , wenn sowohl die WWW-Version als auch die Nicht-WWW-Version aufgelöst werden. Einer sollte auf den anderen als kanonische URL verweisen. Wie Sie sich dafür entscheiden, hängt davon ab, ob Sie HTTPS verwenden oder nicht. Wenn Sie dies nicht tun, sollten Sie wahrscheinlich so sein, wie Heroku SSL-Zertifikate jetzt automatisch und kostenlos für alle Anwendungen verarbeitet, die auf kostenpflichtigen Prüfständen ausgeführt werden.

Wenn Sie nicht HTTPS verwenden, können Sie nur eine 301 - Redirect Rekord mit den meisten DNS - Anbieter zeigt Namen einrichten wwwzu http://example.com.

Wenn Sie sind HTTPS verwenden, werden Sie wahrscheinlich Notwendigkeit , die Umleitung auf der Anwendungsebene zu behandeln. Wenn Sie wissen möchten, warum, lesen Sie diese kurzen und langen Erklärungen. Da Ihr DNS-Anbieter oder ein anderer URL-Weiterleitungsdienst jedoch nicht über Ihr SSL-Zertifikat und Ihren privaten Schlüssel verfügt und dies auch nicht tun sollte, können sie nicht auf HTTPS reagieren Anfragen für Ihre Domain.

Um die Weiterleitungen auf Anwendungsebene zu verarbeiten, müssen Sie:

  • Fügen Sie der Heroku-Anwendung ( heroku domains:add example.comund heroku domains:add www.example.com) sowohl Ihren Apex- als auch Ihren WWW-Hostnamen hinzu.
  • Richten Sie Ihre SSL-Zertifikate ein
  • Richten Sie Ihren Apex-Domain-Eintrag mit einem ALIAS- oder ANAME-Eintrag wie oben beschrieben auf Heroku
  • Fügen Sie einen CNAME-Datensatz hinzu, dessen Name auf wwwzeigtwww.example.com.herokudns.com.
  • Und dann leiten 301 in Ihrer Anwendung alle WWW-Anfragen an die Nicht-WWW-URL um ( hier ein Beispiel, wie dies in Django gemacht wird).
  • Auch in der Anwendung, sollten Sie wahrscheinlich Umleitung jeden HTTP - Anfragen an HTTPS (zum Beispiel in Django gesetzt SECURE_SSL_REDIRECTzu True)

Weitere Informationen finden Sie in diesem Beitrag von DNSimple.

Jeff Bowen
quelle
3

Ich verwende jetzt Google Apps (für E-Mail) und Heroku als Webserver. Ich verwende die permanente Weiterleitungsfunktion von Google Apps 301, um die nackte Domain auf WWW.Ihre_Domäne.com umzuleiten

Die Schritt-für-Schritt-Anleitung finden Sie hier https://stackoverflow.com/a/20115583/1440255

Leo Tulipan
quelle
2

Sie dürfen keinen CNAME-Eintrag für die Domäne haben, da der CNAME eine Aliasing-Funktion ist, die alle Datentypen abdeckt (unabhängig davon, ob der Client nach MX-, NS- oder SOA-Einträgen sucht). CNAMEs beziehen sich auch immer auf einen neuen Namen, nicht auf eine IP-Adresse, sodass die einzelne Zeile tatsächlich zwei Fehler enthält

@                        IN CNAME   88.198.38.XXX

Wenn Sie diesen CNAME in einen A-Datensatz ändern, sollte dies funktionieren, vorausgesetzt, die von Ihnen verwendete IP-Adresse ist die richtige für Ihre Heroku-App.

Die einzig richtige Möglichkeit in DNS, einen einfachen domain.comNamen im Browser zum Funktionieren zu bringen, besteht darin, die Domain auf eine IP-Adresse mit einem A-Eintrag zu verweisen.

krisku
quelle
Ok, aber wie kann ich meine IP herausfinden? Über den Host appname.herokuapp.com/www.domain.com erhalte ich einfach eine solche IP: 107.20.162.205 (Keine solche Heroku-App)
mrks
1
Diese IP ist die zu verwendende. Sie können im Browser einfach nicht mit einer IP-Adresse testen, da Heroku den Namen der App kennen muss, die Sie verwenden möchten. Richten Sie einfach den A-Eintrag in DNS ein und testen Sie mit than, und Heroku sieht den Namen, den Sie verwenden, und alles sollte in Ordnung sein!
Krisku
Ok, aber ich bekomme jedes Mal eine andere IP nach "host appname.herokuapp.com".
Mrks
2
host app-name.herokuapp.comErgebnisse sind dynamisch. Wenn Sie diese fest codieren, wird Ihre App schließlich bremsen. Siehe ANAME / CNAME-Lösungen, die in einem anderen Kommentar empfohlen werden.
kch
1
Sie benötigen einen Webserver mit einer sich nicht ändernden IP-Adresse, der eine HTTP-Umleitung von domain.com -> www.domain.com durchführen und domain.com auf diese IP-Adresse verweisen kann. Dann können Sie einen CNAME für www.domain.com auf die echte Heroku-App verweisen lassen.
Krisku