Câu hỏi Sự khác biệt giữa URI, URL và URN là gì?


Mọi người nói về URLS, URIcát URNnhư thể chúng là những thứ khác nhau, nhưng chúng trông giống như mắt thường.

Sự khác biệt có thể phân biệt giữa chúng là gì?


3710
2017-10-06 21:26


gốc


URL cụ thể hơn URI. - mk12
Tor quản trị viên web đưa ra câu hỏi này: Sự khác biệt giữa URI và URL là gì - hippietrail
Sơ đồ Venn Mini: ( URIs ( URLs ) ) - icc97
Dường như có rất nhiều sự nhầm lẫn về URI so với URL, ngay cả với những người cố gắng trả lời câu hỏi. Nó sẽ mang lại lợi ích cho mọi người để xem ví dụ thực tế về các URL không phải là URI, ví dụ về URI không phải là URL và các ví dụ là URL và URI. - Dennis
Kathy: "Con chó của anh à?" Bob: "Sẽ đúng hơn nếu gọi anh ta là chó." Kathy: "Không, anh ấy là một con chó. Bạn, thưa bạn, là một người đi bộ." - Yojimbo


Các câu trả lời:


Từ RFC 3986:

Một URI có thể được phân loại như một định vị, một tên hoặc cả hai. Các      thuật ngữ "Uniform Resource Locator" (URL) đề cập đến tập con của URI      rằng, ngoài việc xác định tài nguyên, hãy cung cấp phương tiện      định vị tài nguyên bằng cách mô tả cơ chế truy cập chính của nó      (ví dụ: mạng "vị trí" của mạng). Thuật ngữ "Uniform Resource Name"      (URN) đã được sử dụng trong lịch sử để chỉ cả hai URI theo      lược đồ "urn" [RFC2141], được yêu cầu duy trì duy nhất trên toàn cầu      và liên tục ngay cả khi tài nguyên ngừng tồn tại hoặc trở thành      không có sẵn và cho bất kỳ URI nào khác có thuộc tính của tên.

Vì vậy, tất cả URL là URI (thực sự không hoàn toàn - xem bên dưới) và tất cả URN đều là URI - nhưng URN và URL khác nhau, vì vậy bạn không thể nói rằng tất cả URI là URL.

EDIT: Tôi đã từng nghĩ rằng tất cả các URL là URI hợp lệ, nhưng theo nhận xét:

không phải "tất cả URL là URI". Nó phụ thuộc vào việc giải thích RFC. Ví dụ trong Java, trình phân tích cú pháp URI không thích [ hoặc là ] và đó là bởi vì spec nói "không nên" và không "sẽ không".

Vì vậy, không may là những vùng nước sâu hơn.

Nếu bạn chưa đọc Câu trả lời của Roger Pate, Tôi cũng khuyên bạn nên làm như vậy.


1516
2017-10-06 21:29



Chỉ URI với lược đồ urn: là URN. URI có thể là URL cổ điển, URN hoặc chỉ một URI không bắt đầu bằng "urn:" và không đề cập đến vị trí của tài nguyên. - Mark Cidade
Lưu ý rằng RFC 2396 đã bị lỗi thời bởi RFC 3986 một thời gian dài trước đây (nhưng điều đó không thay đổi sự thật ...) - Julian Reschke
không phải "tất cả URL là URI"Nó phụ thuộc vào việc giải thích RFC. Ví dụ trong Java trình phân tích URI không thích [ hoặc là ] và đó là bởi vì spec nói "không nên" và không "sẽ không". - Adam Gent
@AdamGent: RFC 3986 1.1.3: "URI có thể được phân loại thêm dưới dạng định vị, tên hoặc cả hai." Vì vậy, nếu URL là một loại URI đặc biệt, điều đó có nghĩa là mỗi URL là một URI. Phải không? - Hubert
@AdamGent: Điều đó nghe có vẻ giống như một sự thực thi Java, và không phải là quy chuẩn. Các java.net.URI doc chính nó nói "mỗi URL là một URI, nói một cách trừu tượng, nhưng không phải mọi URI đều là một URL". Và java.net.URL những công cụ lạ như kiểm tra sự bình đẳng của URL bằng cách phân giải tên máy chủ thành địa chỉ IP (có vẻ như tỷ lệ cược với RFC 3986 giây 6 ở vị trí đầu tiên và phá vỡ các máy chủ ảo). Tôi nghĩ điều này chỉ có nghĩa là Thư viện chuẩn Java có một số hành vi của lớp không nhất quán. - Andrew Janke


URIs xác định và URLđịnh vị; Tuy nhiên, định vị cũng là số nhận dạng, do đó, mỗi URL cũng là một URI, nhưng có URI không phải là URL.

Ví dụ

  • Roger Pate

Đây là tên của tôi, đó là một định danh. Nó giống như một URI, nhưng không thể là một URL, vì nó không cho bạn biết gì về vị trí của tôi hoặc cách liên hệ với tôi. Trong trường hợp này, nó cũng xảy ra để xác định ít nhất 5 người khác ở Hoa Kỳ một mình.

  • 4914 West Bay Street, Nassau, Bahamas

Đây là một định vị, là một định danh cho vị trí vật lý đó. Nó giống như cả URL và URI (vì tất cả URL là URI) và cũng xác định tôi gián tiếp là "cư dân của ..". Trong trường hợp này, nó nhận dạng duy nhất tôi, nhưng điều đó sẽ thay đổi nếu tôi có bạn cùng phòng.

Tôi nói "thích" vì những ví dụ này không tuân theo cú pháp cần thiết.

Sự nhầm lẫn phổ biến

Từ Wikipedia:

Trong máy tính, một bộ định vị tài nguyên thống nhất (URL) là một tập hợp con của Bộ định danh tài nguyên đồng nhất (URI) xác định nơi một tài nguyên được xác định có sẵn và cơ chế để lấy nó. Trong việc sử dụng phổ biến và trong nhiều tài liệu kỹ thuật và thảo luận bằng lời nói, nó thường được sử dụng không chính xác làm từ đồng nghĩa cho URI, ... [nhấn mạnh mỏ]

Do sự nhầm lẫn phổ biến này, nhiều sản phẩm và tài liệu không chính xác sử dụng một thuật ngữ thay vì một thuật ngữ khác, chỉ định sự phân biệt của riêng chúng hoặc sử dụng chúng một cách đồng nghĩa.

URN

Tên tôi, Roger Pate, có thể giống như một URN (Tên tài nguyên thống nhất), ngoại trừ nhiều quy định hơn và được dự định là duy nhất trên cả hai không gian và thời gian.

Bởi vì tôi hiện đang chia sẻ tên này với những người khác, nó không phải là duy nhất trên toàn cầu và sẽ không thích hợp với tư cách là một URN. Tuy nhiên, ngay cả khi không có gia đình nào khác sử dụng tên này, tôi được đặt tên theo ông nội của tôi, vì vậy nó vẫn sẽ không phải là duy nhất theo thời gian. Và ngay cả khi cái đó không phải vậy, khả năng đặt tên con cháu của tôi sau khi tôi làm điều này không phù hợp với tư cách là một URN.

URN khác với các URL trong ràng buộc duy nhất cứng nhắc này, mặc dù cả hai đều chia sẻ cú pháp của URI.


3524
2017-12-31 06:32



URNs are different from URLs in this rigid uniqueness constraint Điều này có nghĩa là URL không xác định duy nhất một vị trí? - eugene
Câu trả lời của Roger cung cấp lời khuyên thực dụng tốt. Đối với câu trả lời chính thức, tôi đi đến W3C đã xuất bản "URI, URL và URN: Làm rõ và đề xuất"vào năm 2001. Tóm lại, W3C nói quan điểm đương đại là mọi thứ đều là URI. URL là một khái niệm không chính thức, không phải là một khái niệm chính thức. Và sự nhầm lẫn ngày trở lại một" chế độ xem cổ điển "đã cố gắng phân biệt một cách cứng nhắc giữa các loại URI (trong đó URL là một danh mục). - netjeff
..a Uniform Resource Locator (URL) .. xác định nơi một tài nguyên được xác định có sẵn và cơ chế để lấy nó. Vì vậy, nói cách khác, không có những điều như một URL "tương đối"? - Arne
Là "earth128: Edward-de-Leau / 6000000000569063853" (tôi duy nhất trên đa vũ trụ) URN, URL hoặc URI? - edelwater
@edelwater: Tôi cho rằng đó là một uri vì nó chỉ xác định bạn nhưng không nói gì về cách để có được bạn, trừ khi bạn có nghĩa là earth128 là một số phương tiện của hành tinh liên hành tinh :) - user20358


URI - Mã định danh tài nguyên đồng nhất

URI là một tiêu chuẩn để xác định tài liệu bằng cách sử dụng một chuỗi ngắn các số, chữ cái và ký hiệu. Chúng được xác định bởi RFC 3986 - Mã định danh tài nguyên đồng nhất (URI): Cú pháp chung. URL, URN và URC đều là các loại của URI.

URL - Đồng phục nhân viên

Chứa thông tin về cách tìm nạp tài nguyên từ vị trí của nó. Ví dụ:

  • http://example.com/mypage.html
  • ftp://example.com/download.zip
  • mailto:user@example.com
  • file:///home/user/file.txt
  • tel:1-888-555-5555
  • http://example.com/resource?foo=bar#fragment
  • /other/link.html (URL tương đối, chỉ hữu ích trong ngữ cảnh của một URL khác)

URL luôn bắt đầu bằng giao thức (http) và thường chứa thông tin như tên máy chủ lưu trữ mạng (example.com) và thường là đường dẫn tài liệu (/foo/mypage.html). URL có thể có thông số truy vấn và số nhận dạng phân đoạn.

URN - Tên tài nguyên thống nhất

Xác định tài nguyên theo tên duy nhất và liên tục, nhưng không nhất thiết phải cho bạn biết cách định vị tài nguyên trên internet. Nó thường bắt đầu bằng tiền tố urn:  Ví dụ:

  • urn:isbn:0451450523 để xác định một cuốn sách theo số ISBN của nó.
  • urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66 một số nhận dạng duy nhất trên toàn cầu
  • urn:publishing:book - Một vùng tên XML xác định tài liệu dưới dạng một loại sách.

URN có thể xác định các ý tưởng và khái niệm. Chúng không bị giới hạn trong việc xác định tài liệu. Khi URN đại diện cho một tài liệu, nó có thể được dịch sang một URL bởi một "người giải quyết". Tài liệu sau đó có thể được tải xuống từ URL.

URC - Trích dẫn nguồn đồng nhất

Điểm đến siêu dữ liệu về tài liệu chứ không phải chính tài liệu. Một ví dụ về URC là một ví dụ trỏ đến mã nguồn HTML của một trang như: view-source:http://example.com/

URI dữ liệu

Thay vì định vị nó trên internet, hoặc đặt tên nó, dữ liệu có thể được đặt trực tiếp vào một URI. Một ví dụ sẽ là data:,Hello%20World.


Các câu hỏi thường gặp

Tôi đã nghe nói rằng tôi không nên nói URL nữa, tại sao?

Thông số W3 cho HTML nói rằng href của một thẻ neo có thể chứa URI, không chỉ là URL. Bạn sẽ có thể đặt vào một URN như <a href="urn:isbn:0451450523">. Trình duyệt của bạn sau đó sẽ giải quyết URN đó thành một URL và tải xuống sách cho bạn.

Có phải trình duyệt nào thực sự biết cách tìm nạp tài liệu bằng URN không?

Không phải là tôi biết, nhưng trình duyệt web hiện đại thực hiện lược đồ URI dữ liệu.

Sự khác biệt giữa URL và URI có liên quan gì đến việc nó có liên quan hay tuyệt đối không?

Không. Cả URL tương đối và tuyệt đối đều là URL (và URI).

Sự khác nhau giữa URL và URI có liên quan gì đến việc liệu nó có tham số truy vấn không?

Không. Cả hai URL có và không có tham số truy vấn là URL (và URI).

Sự khác biệt giữa URL và URI có liên quan gì đến việc liệu nó có định danh phân đoạn không?

Không. Cả hai URL có và không có số nhận dạng phân đoạn là URL (và URI).

Sự khác nhau giữa URL và URI có liên quan gì đến những nhân vật được phép không?

Không. URL được định nghĩa là tập con URI nghiêm ngặt. Nếu trình phân tích cú pháp cho phép một ký tự trong một URL nhưng không phải trong một URI, thì có một lỗi trong trình phân tích cú pháp. Các thông số kỹ thuật đi sâu vào chi tiết về các ký tự được phép trong đó các phần của URL và URI. Một số ký tự chỉ có thể được phép ở một số phần của URL, nhưng các ký tự không phải là sự khác biệt giữa URL và URI.

Nhưng hiện tại W3C có nói rằng URL và URI là giống nhau không?

Vâng. W3C nhận ra rằng có rất nhiều sự nhầm lẫn về điều này. Họ đã phát hành Tài liệu làm rõ URI mà nói rằng bây giờ là OK để sử dụng các điều khoản URL và URI thay thế cho nhau (nghĩa là URI). Nó không còn hữu ích để phân đoạn nghiêm ngặt các URI thành các loại khác nhau như URL, URN và URC.

URI có thể là cả URL và URN không?

Định nghĩa của URN bây giờ còn lỏng hơn những gì tôi đã nói ở trên. Các RFC mới nhất trên URI nói rằng bất kỳ URI nào bây giờ có thể là URN (bất kể nó bắt đầu bằng urn:) miễn là nó có "các thuộc tính của một tên." Đó là: Nó là duy nhất trên toàn cầu và liên tục ngay cả khi tài nguyên ngừng tồn tại hoặc không có sẵn. Ví dụ: Các URI được sử dụng trong các loại tài liệu HTML chẳng hạn như http://www.w3.org/TR/html4/strict.dtd. URI đó sẽ tiếp tục đặt tên cho loại tài liệu chuyển tiếp HTML4 ngay cả khi trang trên trang web w3.org đã bị xóa.


URI/URL Venn Diagram


476
2018-03-04 21:51



là "C: \ myfile" một URI, URL hoặc URN? hoặc không ai trong số họ. - bvdb
Đường dẫn tệp không phải là URL hoặc URI trừ khi bạn đặt file:// tiền tố trên đó. Mặc dù các trình duyệt thường xử lý các đường dẫn tệp không được định dạng URL. Mozilla xuất bản các trường hợp thử nghiệm của họ cho các URL của tệp. - Stephen Ostermiller
Tại sao chúng "đồng phục"? - hkBattousai
Xem phần 1.1 của RFC "Đồng nhất cung cấp nhiều lợi ích. Nó cho phép các loại định danh tài nguyên khác nhau được sử dụng trong cùng một ngữ cảnh, ngay cả khi các cơ chế được sử dụng để truy cập các tài nguyên đó có thể khác nhau. Nó cho phép diễn giải đồng nhất các quy ước cú pháp thông thường trên các loại định danh tài nguyên khác nhau ... " - Stephen Ostermiller
Câu trả lời này dễ hiểu hơn rất nhiều. Tôi có thể thấy những hình ảnh rõ ràng về ví dụ thực sự về URL & URN. Và để mọi người đọc thêm về điều này ... danielmiessler.com/study/url-uri - vee


Tóm tắt: URI xác định, một URL xác định và định vị.

Hãy xem xét một phiên bản cụ thể của vở kịch của Shakespeare Romeo và Juliet, trong đó bạn có một bản sao kỹ thuật số trên mạng gia đình của bạn.

Bạn có thể xác định văn bản là urn:isbn:0-486-27557-4.
Đó sẽ là một URI, nhưng cụ thể hơn là URN* bởi vì nó đặt tên cho văn bản.

Bạn cũng có thể xác định văn bản là file://hostname/sharename/RomeoAndJuliet.pdf.
Đó cũng sẽ là một URI, nhưng cụ thể hơn là URL bởi vì nó định vị văn bản.

* Tên tài nguyên đồng nhất

(Lưu ý rằng ví dụ của tôi được điều chỉnh từ Wikipedia)


233
2017-12-31 06:51



Thật hữu ích khi lưu ý URN thực tế (để xem nó so sánh với một URL) như thế nào: urn: isbn: 0-486-27557-4 - Michael Brewer-Davis
@ Michael - Đó là sự hiểu biết của tôi rằng ISBN 0486275574 cũng đặt tên cho văn bản và do đó đủ điều kiện làm URN. Tôi chọn một định dạng mà tôi tin rằng sẽ quen thuộc hơn với độc giả. - Greg
Vì vậy, nó sẽ có ý nghĩa để nói rằng băm (ví dụ SHA1) của một tập tin có thể là một URN cho tập tin đó? - johnsimer
@johnsimer Đừng nghĩ như vậy, vì bạn có thể có một bản sao của một tập tin trên cùng một máy tính, mà sẽ dẫn đến cùng một băm và do đó nó không phải là duy nhất. - Dennis98


Đây là một số câu trả lời rất hay nhưng có câu trả lời dài. Đây là sự khác biệt theo như CodeIgniter có liên quan:

URL - - http://example.com/some/page.html

URI - /some/page.html

Nói một cách đơn giản, URL là cách đầy đủ để xác định bất kỳ tài nguyên nào ở bất kỳ đâu và có thể có các giao thức khác nhau như FTP, HTTP, SCP, v.v.

URI là một tài nguyên trên tên miền hiện tại, vì vậy nó cần ít thông tin hơn để được tìm thấy.

Trong mọi trường hợp CodeIgniter sử dụng URL từ hoặc URI, đây là sự khác biệt mà chúng đang nói đến, mặc dù trong lược đồ lớn của web, nó không chính xác 100%.


125
2017-12-31 08:58



Câu trả lời này có thể quá đơn giản nhưng nhìn vào ngữ cảnh câu hỏi của anh ta. Nó sẽ hữu ích hơn cho anh ta mà làm say mê về các không gian tên XML! - Phil Sturgeon
Câu trả lời này không chỉ sai mà còn gây hiểu lầm tích cực. Cả hai ví dụ là URL. Và vì mỗi URL cũng là một URI, điều này có nghĩa là cả hai ví dụ là URI. Với mục đích thể hiện sự khác biệt giữa URI và URL, điều này hoàn toàn vô dụng. - Jörg W Mittag
Đây là sự khác biệt xa như CodeIgniter có liên quan. Trong mọi trường hợp, họ sử dụng URL từ hoặc URI, đây là sự khác biệt mà họ đang nói đến. Do đó trong sơ đồ lớn của web, nó không chính xác 100% nhưng trong phạm vi câu hỏi của OP (sự khác biệt trong CodeIgniter), câu trả lời này là hoàn toàn chính xác. - Phil Sturgeon
Cái này sai. @ JörgWMittag chủ yếu là điểm. URL là URI và chúng "hoàn toàn đủ điều kiện"; do đó, "URL" trong câu trả lời này là cả hai. Nhưng /some/page.html không phải là URI. Nó là "tương đối-ref", là một loại "tham chiếu URI". Kết hợp với bối cảnh URI cơ sở, nó có thể được giải quyết thành một URI, nhưng không phải là một URI. Xem Phần 4.1 của RFC 3986. CodeIgniter có thể sử dụng các thuật ngữ sai và cần được gọi ra; các Q (như hiện đang chỉnh sửa) không được đóng khung như CodeIgniter cụ thể. - Andrew Janke
Đối với những người trong tương lai, những người đọc những bình luận này và bối rối như tôi: Câu trả lời này không được đăng cho câu hỏi này. Câu hỏi này không bao giờ có liên quan gì đến CodeIgniter. Có một câu hỏi trùng lặp được nhắc đến cụ thể là CodeIgniter đã bị đóng và có tất cả các câu trả lời của nó được chuyển sang câu hỏi này. Câu trả lời này là một trong những câu hỏi đã được chuyển từ câu hỏi đã đóng cũ sang câu hỏi được bảo vệ này. Mặc dù vậy, tôi câu trả lời này là gây hiểu lầm. Tôi đã downvoted nó - những người khác nên làm như vậy kể từ, trong nhà mới của nó, nó là sai. Tác giả nên xóa nó hoặc hợp nhất được hoàn tác. - ArtOfWarfare


Một bổ sung nhỏ cho các câu trả lời đã được đăng, đây là biểu đồ của Venn để tóm tắt lý thuyết (từ Prateek Joshi đẹp giải trình):

enter image description here

Và một ví dụ (cũng từ trang web của Prateek):

enter image description here


64
2017-10-16 17:46



Tôi tin rằng minh họa thứ hai là không chính xác. Theo các đặc điểm kỹ thuật url.spec.whatwg.org/#url-writing  URL phải được viết dưới dạng URL tương đối hoặc URL tuyệt đối, theo sau là "#" và một đoạn. Vì thế, #posts định danh phân đoạn có thể là một phần của URL - ruvim
đây chỉ là một lỗi bình thường - Engineer Dollery
Hai hình minh họa mâu thuẫn nhau. - patapouf_ai


Đây là một trong những chủ đề khó hiểu nhất và có thể không liên quan mà tôi gặp phải với tư cách là một chuyên gia web.

Theo tôi hiểu nó, một URI là một mô tả của một cái gì đó, theo một định dạng được chấp nhận, có thể xác định cả hai hoặc là tên duy nhất (nhận dạng) của một cái gì đó và vị trí của nó.

Có hai tập con cơ bản - URL, xác định vị trí (đặc biệt là đối với trình duyệt đang tìm kiếm một trang web) và URN, xác định tên duy nhất của một cái gì đó.

Tôi có xu hướng nghĩ về URNs tương tự như GUIDs. Họ chỉ đơn giản là một phương pháp chuẩn hóa để cung cấp tên duy nhất cho mọi thứ. Như trong khai báo không gian tên sử dụng tên của công ty - nó không giống như có một tài nguyên đang ngồi trên một máy chủ ở đâu đó tương ứng với dòng văn bản đó - nó chỉ đơn giản là nhận dạng một cái gì đó.

Tôi cũng có xu hướng hoàn toàn tránh thuật ngữ URI và chỉ thảo luận mọi thứ về URL hoặc URN khi thích hợp, bởi vì nó gây ra nhiều nhầm lẫn. Câu hỏi chúng ta nên thực sự trả lời cho mọi người không phải là nhiều ngữ nghĩa, nhưng làm thế nào để xác định khi gặp phải các điều khoản có hay không có bất kỳ sự khác biệt thực tế nào trong chúng sẽ thay đổi cách tiếp cận với một tình huống lập trình. Ví dụ, nếu ai đó sửa chữa tôi trong cuộc trò chuyện và nói, "ồ, đó không phải là một URL, đó là một URI" Tôi biết họ đã đầy. Nếu ai đó nói "chúng tôi đang sử dụng URN để xác định tài nguyên", tôi có nhiều khả năng hiểu rằng chúng tôi chỉ đặt tên nó là duy nhất, không định vị nó trên máy chủ.

Nếu tôi rời khỏi cơ sở - hãy cho tôi biết!


52
2017-12-01 13:07



Không, tôi nghĩ bạn nói đúng. Ngữ nghĩa của URI so với URL so với URL so với URI-ref vv là vô ích đối với hầu hết các nhà phát triển, chỉ vì nó thúc đẩy cuộc tranh luận vô nghĩa (không hiệu quả, không đáng kể để ra quyết định). Nếu API Google được sử dụng redirect_urlthay vì redirect_uri, liệu có ai thực sự quan tâm? - Alexander Pritchard


Trước hết hãy khiến tâm trí của bạn rối tung và mang nó đơn giản và bạn sẽ hiểu.

URI => Mã định danh tài nguyên đồng nhất Xác định địa chỉ đầy đủ của vị trí i-e tài nguyên, tên hoặc cả hai.

URL => Trình định vị tài nguyên đồng nhất Xác định vị trí của tài nguyên.

URN => Tên tài nguyên đồng nhất Xác định tên của tài nguyên

Thí dụ

Chúng tôi có địa chỉ https://www.google.com/folder/page.html Ở đâu,

URI (Mã định danh tài nguyên đồng nhất) => https://www.google.com/folder/page.html

URL (Trình định vị tài nguyên đồng nhất) => https://www.google.com/

URN (Tên tài nguyên thống nhất) => /folder/page.html

URI => (URL + URN) hoặc chỉ URL hoặc URN


44
2017-07-21 17:50



câu trả lời tốt, ngắn, dễ hiểu và rõ ràng !!! - Björn Hallström