ฉันจะตั้งค่า 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 ของฉันได้อย่างถูกต้อง


btw ดูเหมือนว่าการตั้งค่า ftp / pop / smtp ของคุณจะผิดทั้งหมดเนื่องจากมันชี้ไปที่ www ซึ่งชี้ไปที่ heroku ที่ไม่ทำ ftp / pop / smtp
kch

โซลูชันอื่นstackoverflow.com/a/11494197/176877
Chris Moschini

คำตอบ:


145

(หมายเหตุ: โดเมน root, base, apex ล้วนเหมือนกันใช้แทนกันได้สำหรับ 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.comHTTP เปลี่ยนเส้นทางไปที่www.example.comเปลี่ยนเส้นทางไปยัง

ผู้ให้บริการ DNS บางรายได้นำเสนอโซลูชันแบบกำหนดเองที่อนุญาตให้มีพฤติกรรมคล้าย CNAME ในโซนเอเพ็กซ์ ความรู้ของฉันเรามีบันทึก ALIAS DNSimple ของและบันทึก ANAME DNS Made Easy ของ ; ทั้งสองมีพฤติกรรมคล้ายกัน

ด้วยการใช้สิ่งเหล่านี้คุณสามารถตั้งค่าบันทึกของคุณเป็น (โดยใช้สัญกรณ์ zonefile แม้ว่าคุณจะทำสิ่งนี้บนอินเทอร์เฟซผู้ใช้บนเว็บ):

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

โปรดจำไว้ว่า@นี่คือชวเลขสำหรับโดเมนราก ( example.com) โปรดทราบว่าจุดต่อท้ายมีความสำคัญทั้งในไฟล์โซนและอินเทอร์เฟซผู้ใช้บางเว็บ

ดูสิ่งนี้ด้วย:

หมายเหตุ:

  • เส้นทาง 53 ของ Amazon ยังมีประเภทบันทึก ALIAS แต่ค่อนข้าง จำกัด เนื่องจากใช้งานได้เฉพาะใน AWS เท่านั้น ในขณะนี้ฉันไม่แนะนำให้ใช้สิ่งนี้สำหรับการตั้งค่า Heroku

  • บางคนสับสนระหว่างผู้ให้บริการ DNS กับผู้รับจดทะเบียนชื่อโดเมนเนื่องจากมีความซ้ำซ้อนกับ บริษัท ที่ให้บริการทั้งสองอย่าง โปรดทราบว่าในการเปลี่ยน DNS ของคุณไปเป็นหนึ่งในผู้ให้บริการดังกล่าวข้างต้นคุณจะต้องอัปเดตระเบียนเซิร์ฟเวอร์ชื่อของคุณกับผู้รับจดทะเบียนโดเมนปัจจุบันของคุณเท่านั้น คุณไม่จำเป็นต้องโอนการจดทะเบียนโดเมนของคุณ


1
นอกจากนี้โปรดดูHeroku's Dev Center
Jon Mountjoy

3
+1 สำหรับการกล่าวถึง dnsimple ความพยายามของพวกเขาที่จะทำให้ง่ายต่อการทำงานกับผู้ให้บริการระบบคลาวด์เป็นปัจจัยสำคัญในการตัดสินใจเปลี่ยนมาใช้บริการเหล่านี้
Subfuzion

1
@kch คุณรู้วิธีใดบ้างที่ฉันสามารถสร้างประเภทระเบียน DNS ที่ทำงานเหมือน ALIAS ของ DNSimple ใน BIND
wlf

1
อย่าคิดว่าคุณทำได้ เป็นคุณลักษณะที่กำหนดเอง
kch

2
CloudFlare ยังมีคุณสมบัตินี้ผ่านสิ่งที่พวกเขาเรียกCNAME แฟบ โดยอัตโนมัติสำหรับระเบียน CNAME ที่คุณสร้างที่ราก แต่จะเปิดใช้งานในโซนทั้งหมดของคุณสำหรับระเบียน CNAME ทั้งหมดหากคุณติดต่อและขอข้อมูล
Adrian Frühwirth

4

หากต้องการชี้โดเมนเอเพ็กซ์ / รูท / เปล่าของคุณไปที่แอปพลิเคชันที่โฮสต์ Heroku คุณจะต้องใช้ผู้ให้บริการ DNS ที่รองรับระเบียนที่มีลักษณะคล้าย CNAME (มักเรียกว่าระเบียน ALIAS หรือ ANAME) ปัจจุบัน Heroku แนะนำ :

ไม่ว่าคุณจะเลือกแบบใดบันทึกของคุณจะมีลักษณะดังต่อไปนี้:

บันทึก: ALIASหรือANAME

ชื่อ:ว่างหรือ@

เป้าหมาย: example.com.herokudns.com.

นั่นคือทั้งหมดที่คุณต้องการ


อย่างไรก็ตามไม่ใช่เรื่องดีที่ SEOจะมีทั้งเวอร์ชัน www และเวอร์ชันที่ไม่ใช่ www รายการหนึ่งควรชี้ไปที่อีกรายการเป็น URL ตามรูปแบบบัญญัติ วิธีที่คุณตัดสินใจทำนั้นขึ้นอยู่กับว่าคุณใช้ HTTPS หรือไม่ และถ้าคุณไม่เป็นเช่นนั้นคุณก็น่าจะเป็นเพราะตอนนี้ Heroku จัดการใบรับรอง SSL ให้คุณโดยอัตโนมัติและฟรีสำหรับแอปพลิเคชันทั้งหมดที่ทำงานบน dynos แบบเสียเงิน

หากคุณไม่ได้ใช้ HTTPS คุณก็สามารถตั้งค่าการบันทึก 301 เปลี่ยนเส้นทางส่วนใหญ่ผู้ให้บริการ DNS ชี้ชื่อไปwwwhttp://example.com

หากคุณกำลังใช้ HTTPS คุณจะมีโอกาสมากที่สุดที่จะจัดการกับความจำเป็นในการเปลี่ยนเส้นทางในระดับแอพลิเคชัน หากคุณต้องการทราบสาเหตุลองดูสั้น ๆและยาวคำอธิบายแต่โดยพื้นฐานแล้วเนื่องจากผู้ให้บริการ DNS หรือบริการส่งต่อ URL อื่น ๆ ไม่มีและไม่ควรมีใบรับรอง SSL และคีย์ส่วนตัวของคุณจึงไม่สามารถตอบสนองต่อ HTTPS ได้ ขอโดเมนของคุณ

ในการจัดการการเปลี่ยนเส้นทางในระดับแอปพลิเคชันคุณจะต้อง:

  • เพิ่มทั้งชื่อโฮสต์ apex และ www ของคุณลงในแอปพลิเคชัน Heroku ( heroku domains:add example.comและheroku domains:add www.example.com)
  • ตั้งค่าใบรับรอง SSL ของคุณ
  • ชี้ระเบียนโดเมน apex ของคุณไปที่ 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 และทดสอบด้วยกว่าและ 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 และชี้โดเมน. com ไปยังที่อยู่ IP นั้น จากนั้นคุณสามารถให้ CNAME สำหรับ www.domain.com ชี้ไปที่แอป heroku ที่แท้จริง
krisku
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.