Làm thế nào để vượt qua các hạn chế CNAME miền gốc?


117

Chúng tôi đang lưu trữ nhiều ứng dụng web cho khách hàng của mình. Rõ ràng là họ muốn sử dụng tên miền của riêng mình để tham chiếu đến các ứng dụng đó, thông thường họ muốn bất kỳ người dùng nào nhập http://www.customer1.examplehoặc http://customer1.exampletruy cập ứng dụng web của họ.

Tình huống mà chúng ta đang gặp phải là chúng ta cần có sự linh hoạt để thay đổi địa chỉ IP trong tương lai gần. Và chúng tôi không muốn dựa vào việc khách hàng thực hiện thay đổi bản ghi A trên miền của họ. Vì vậy, chúng tôi nghĩ rằng việc sử dụng CNAMEcác bản ghi sẽ hoạt động, nhưng khi chúng tôi phát hiện ra CNAMEcác bản ghi sẽ không hoạt động cho miền gốc.

Về cơ bản:

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

Chúng tôi muốn có thể thay đổi địa chỉ IP của customer1.mycompanydomain.examplehoặc Abản ghi và khách hàng của chúng tôi sẽ tuân theo bản ghi này mà chúng tôi có quyền kiểm soát.

trong DNS của chúng tôi, nó sẽ giống như sau:

customer1.mycompanydomain.example IN A 192.0.2.1

Có ý kiến ​​gì không?


Tôi không hiểu tại sao "customer1.com TRONG CNAME customer1.mycompanydomain.com" không hợp lệ. Tôi tin rằng nó sẽ hoạt động. Bạn có thể giải thích vấn đề với giải pháp đó là do đâu?
sleske

3
Vâng, vui lòng đọc câu hỏi và câu trả lời sau đây. Nó không hợp lệ theo DNS RFC. stackoverflow.com/questions/655235/…
Geo

2
Tôi không hiểu tiêu đề của câu hỏi. "Root" (.) Liên quan ở đâu?
bortzmeyer

2
ông có nghĩa là thư mục gốc của một khu vực, không phải là "gốc"
Alnitak

2
Vậy thì, đó không phải là từ vựng DNS thông thường. Không phải "đỉnh" là từ thích hợp sao? Hay "cấp cao nhất" cho các lập trình viên Lisp? :-)
bortzmeyer

Câu trả lời:


63

Lý do mà câu hỏi này vẫn thường nảy sinh là bởi vì, như bạn đã đề cập, ở đâu đó một người nào đó được cho là quan trọng đã viết rằng RFC nêu rõ các tên miền không có tên miền phụ phía trước là không hợp lệ. Tuy nhiên, nếu bạn đọc kỹ RFC, bạn sẽ thấy rằng đây không phải là những gì nó nói. Trên thực tế, RFC 1912 tuyên bố:

Đừng sử dụng CNAME quá đà. Sử dụng chúng khi đổi tên máy chủ, nhưng hãy lên kế hoạch loại bỏ chúng (và thông báo cho người dùng của bạn).

Một số máy chủ DNS cung cấp một cách để có được chức năng giống CNAME ở đỉnh vùng (cấp miền gốc, dành cho tên miền rỗng) bằng cách sử dụng loại bản ghi tùy chỉnh. Các hồ sơ như vậy bao gồm, ví dụ:

  • ALIAS tại DNSimple
  • ANAME tại DNS Made Easy
  • ANAME tại easyDNS
  • CNAME tại CloudFlare

Đối với mỗi nhà cung cấp, cách thiết lập tương tự: trỏ mục nhập ALIAS hoặc ANAME cho miền apex của bạn tới example.domain.com, giống như cách bạn làm với bản ghi CNAME. Tùy thuộc vào nhà cung cấp DNS, giá trị Tên trống hoặc @ sẽ xác định đỉnh vùng.

ALIAS hoặc ANAME hoặc @ example.domain.com.

Nếu nhà cung cấp DNS của bạn không hỗ trợ loại bản ghi như vậy và bạn không thể chuyển sang loại bản ghi đó, bạn sẽ cần sử dụng chuyển hướng tên miền phụ, điều này không khó lắm, tùy thuộc vào giao thức hoặc phần mềm máy chủ cần thực hiện điều đó .

Tôi hoàn toàn không đồng ý với tuyên bố rằng nó chỉ được thực hiện bởi "quản trị viên nghiệp dư" hoặc những ý tưởng như vậy. Đó là một câu hỏi đơn giản "Tên và dịch vụ của nó cần làm gì?" thỏa thuận, và sau đó điều chỉnh cấu hình DNS của bạn để đáp ứng những mong muốn đó; Nếu các dịch vụ chính của bạn là web và e-mail, tôi không thấy bất kỳ lý do HỢP LỆ nào khiến việc loại bỏ các CNAME từ lâu sẽ là vấn đề. Rốt cuộc, ai sẽ thích @ subdomain.domain.org hơn @ domain.org? Ai cần "www" nếu bạn đã thiết lập với chính giao thức? Thật phi lý khi cho rằng việc sử dụng tên miền gốc sẽ không hợp lệ.


1
Câu trả lời cụ thể này rất hữu ích đối với tôi vì tôi muốn trỏ miền cấp gốc tại CDN. Hầu hết các CDN đều cần thiết là FQDN, vì nó có thể phân giải thành các IP khác nhau tại các vị trí hoặc thời điểm khác nhau. Tôi sử dụng DNS Made Easy và có thể sử dụng loại bản ghi ANAME.
Rubix

3
Tôi không thể đồng ý hơn. Muốn lưu trữ một trang web từ tên miền 'trần trụi' là một việc phổ biến và hợp lý. Nó sử dụng ít ký tự hơn, trông đẹp hơn, v.v. Định danh giao thức riêng của url (www) là một phần tiền cảnh của url nếu ngay từ đầu là cần thiết (nó không phải vậy).
Ed Bishop

3
ANAME rất hay, hoặc bạn có thể chỉ 301 tất cả các trang không phải www đến www. qua dịch vụ chuyển hướng 301 miễn phí 198.251.86.133
Jacob Evans

51

CNAME tạo một bản ghi gốc về mặt kỹ thuật không chống lại RFC, nhưng có những hạn chế, nghĩa là đây là một phương pháp không được khuyến khích.

Thông thường bản ghi gốc của bạn sẽ có nhiều mục nhập. Giả sử, 3 cho máy chủ định danh của bạn và sau đó một cho một địa chỉ IP.

Theo RFC:

Nếu có CNAME RR tại một nút, thì không có dữ liệu nào khác;

Và theo tài liệu 'Các lỗi cấu hình và hoạt động DNS phổ biến' của IETF:

Điều này thường được các quản trị viên thiếu kinh nghiệm cố gắng như một cách hiển nhiên để cho phép tên miền của bạn cũng là một máy chủ lưu trữ. Tuy nhiên, các máy chủ DNS như BIND sẽ nhìn thấy CNAME và từ chối thêm bất kỳ tài nguyên nào khác cho tên đó. Vì không có bản ghi nào khác được phép cùng tồn tại với CNAME, các mục NS sẽ bị bỏ qua. Do đó, tất cả các máy chủ trong miền podunk.xx cũng bị bỏ qua!

Người giới thiệu:


17
Nhưng TẠI SAO không có bản ghi nào khác được phép cùng tồn tại với CNAME. Đây chỉ là một hạn chế do tác giả của RFC thêm vào hay là có lý do kỹ thuật cho nó? Nếu không có lý do kỹ thuật cho nó, thì người ta có thể dễ dàng đưa ra một RFC mở rộng.
Sven

Vì vậy, nếu nó hoạt động với tôi (sử dụng CNAME cho bản ghi gốc, các tên miền phụ khác cho tên miền đó vẫn hoạt động), điều đó có nghĩa là tôi thật may mắn và nhà cung cấp dịch vụ triển khai DNS của tôi không bỏ qua các bản ghi bổ sung đó có thể? Và nó cũng có nghĩa là tôi không cần phải lo sợ bất kỳ vấn đề nào ở phía máy khách, miễn là máy chủ DNS xử lý nó như thế này?
didi_X8 Ngày

Đây là một nỗ lực để trả lời một câu hỏi khác, "tại sao CNAME không được phép ở đỉnh", trong khi câu hỏi thực tế là "làm thế nào để khắc phục hạn chế này". -1.
gỉ

Để biết lý do tại sao, hãy xem serverfault.com/questions/613829/…
rhand

CNAME đang sử dụng bản ghi gốc về mặt kỹ thuật không chống lại RFC, bạn sẽ cần giải thích cách nó không chống lại RFC1034 phần 3.6.2: Nếu CNAME RR có mặt tại một nút, thì không có dữ liệu nào khác; điều này đảm bảo rằng dữ liệu cho một tên chuẩn và bí danh của nó không thể khác nhau. . Tất nhiên "gốc" (chính xác là đỉnh trong ngữ cảnh này) đã có NSSOAcác bản ghi và do đó không thể có CNAMEbản ghi.
Patrick Mevzek

4

Tôi không biết làm thế nào họ thoát khỏi nó, hoặc những tác dụng phụ tiêu cực của chúng có thể là gì, nhưng tôi đang sử dụng Hover.com để lưu trữ một số miền của mình và gần đây đã thiết lập đỉnh miền của tôi làm CNAME ở đó. Công cụ chỉnh sửa DNS của họ không phàn nàn gì cả và miền của tôi được giải quyết một cách vui vẻ thông qua CNAME được chỉ định.

Đây là những gì Dig hiển thị cho tôi về miền này (miền thực tế bị xáo trộn là 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

Giải mã, nếu thực sự cần thiết (DNS là công khai ....), nên sử dụng hướng dẫn RFC2606. Và RFC5737 hoặc 3849 cho địa chỉ IP
Patrick Mevzek

3

Công ty của tôi cũng làm điều tương tự đối với một số khách hàng nơi chúng tôi lưu trữ một trang web cho họ mặc dù trong trường hợp của chúng tôi, đó là xyz.company.com chứ không phải www.company.com. Chúng tôi yêu cầu họ thiết lập bản ghi A trên xyz.company.com để trỏ đến địa chỉ IP mà chúng tôi cấp phát cho họ.

Về cách bạn có thể đối phó với sự thay đổi địa chỉ IP, tôi không nghĩ rằng có một giải pháp hoàn hảo. Một số ý tưởng là:

  • Sử dụng bộ cân bằng tải NAT hoặc IP và cung cấp cho khách hàng của bạn địa chỉ IP thuộc về nó. Nếu địa chỉ IP của máy chủ web cần thay đổi, bạn có thể cập nhật NAT hoặc bộ cân bằng tải,

  • Cung cấp dịch vụ lưu trữ DNS và mời khách hàng của bạn lưu trữ miền của họ với bạn để bạn có thể cập nhật các bản ghi A,

  • Giúp khách hàng của bạn thiết lập bản ghi A của họ lên một máy chủ web chính và sử dụng chuyển hướng HTTP cho các yêu cầu web của mỗi khách hàng.


3

Sipwiz là chính xác, cách duy nhất để làm điều này đúng cách là phương pháp kết hợp HTTP và DNS. Công ty đăng ký của tôi là người bán lại cho Tucows và họ cung cấp chuyển tiếp miền gốc như một dịch vụ giá trị gia tăng miễn phí.

Nếu miền của bạn là blah.com, họ sẽ hỏi bạn nơi bạn muốn miền được chuyển tiếp đến và bạn nhập www.blah.com. Họ gán bản ghi A cho máy chủ apache của họ và tự động thêm blah.com làm DNS vhost. Vhost phản hồi với lỗi HTTP 302 chuyển hướng chúng đến URL thích hợp. Nó đơn giản để tập lệnh / thiết lập và có thể được xử lý bởi cấp thấp nếu không sẽ là phần cứng bị loại bỏ.

Chạy lệnh sau để làm ví dụ: curl -v eclecticengineers.com


3

Bạn phải đặt dấu chấm ở cuối tên miền bên ngoài để không nghĩ rằng bạn có nghĩa là customer1.mycompanydomain.com.localdomain;

Vì vậy, chỉ cần thay đổi:

customer1.com IN CNAME customer1.mycompanydomain.com

Đến

customer1.com IN CNAME customer1.mycompanydomain.com.

Đối với tôi (BIND 9.8.2), nếu các bản ghi dành cho miền customer1.com, điều này hoạt động ... nhưng được hiểu là chỉ định CNAMe cho một miền phụ customer1.com.customer1.com. Nếu tôi thêm một điểm vào mục đầu tiên, bản ghi sẽ được diễn giải chính xác, nhưng nó không hoạt động nữa. Tôi không thấy giải pháp nào ở đây.
Jussi Hirvi

-2

Tôi thấy readytocloud.com được lưu trữ trên Apache 2.2.

Có một cách đơn giản và hiệu quả hơn nhiều để chuyển hướng trang không phải www sang trang có www trong Apache.

Thêm các quy tắc ghi lại sau vào cấu hình Apache (bên trong máy chủ ảo hoặc bên ngoài. Điều đó không quan trọng):

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

Hoặc, các quy tắc viết lại sau đây nếu bạn muốn ánh xạ từ 1 đến 1 các URL từ trang web không phải www đến trang có www:

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

Lưu ý, mô-đun mod_rewrite cần được tải để mô-đun này hoạt động. May mắn thay, readytocloud.com đang chạy trên hộp CentOS, theo mặc định tải mod_rewrite.

Chúng tôi có một máy chủ khách chạy Apache 2.2 với chỉ dưới 3.000 miền và gần 4.000 chuyển hướng, tuy nhiên, tải trên máy chủ dao động trong khoảng 0,10 - 0,20.


Câu hỏi là về DNS. Không phải về máy chủ web Apache.
SamTzu

-7

Cảm ơn cả nhâm nhi và MrEvil. Chúng tôi đã phát triển một tập lệnh PHP sẽ phân tích cú pháp URL mà người dùng nhập và dán wwwlên đầu của nó. (ví dụ: nếu khách hàng vào kiragiannis.com , thì nó sẽ chuyển hướng đến www.kiragiannis.com ). Vì vậy, khách hàng của chúng tôi trỏ gốc của họ (ví dụ: customer1.comđể Aghi lại vị trí của trình chuyển hướng web của chúng tôi) và sau đó www CNAMEđến Abản ghi thực do chúng tôi quản lý.

Dưới đây là mã trong trường hợp bạn quan tâm đến chúng tôi trong tương lai.

<?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}");
?>

10
Điều này thực sự không trả lời câu hỏi mà 69k + người đã tìm kiếm chủ đề này. Câu hỏi là về DNS và không liên quan gì đến PHP.
Matt Clark

1
Câu hỏi là về DNS. Không phải về mã hóa PHP.
SamTzu

HTTP_HOST là tên máy chủ, giống như tên của nó, không phải là một URL. Do đó, sẽ không có bất kỳ mục nào http://để xóa, cũng không /( $urlPagePathsẽ luôn trống). Xem httpd.apache.org/docs/2.4/expr.html . Do cách mã cố gắng loại bỏ miền phụ, nó cũng sẽ không hoạt động đối với những thứ như www.example.co.uknơi co.ukphải được xem xét tổng thể. Nó cũng không xử lý HTTPS. Và cuối cùng việc sử dụng PHP chỉ cần thực hiện chuyển hướng HTTP mà bất kỳ máy chủ web nào cũng có thể thực hiện trong cấu hình, là quá phức tạp. Vì vậy, trong ngắn hạn đây chắc chắn không phải là câu trả lời xác thực cho câu hỏi này.
Patrick Mevzek

Nếu quy định này được áp dụng cho tất cả các host sau đó nó phải được thực hiện như một cấu hình apache
Svetoslav Marinov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.