你知道URL、URI和URN三者之間的區(qū)別嗎?
這是一個經(jīng)典的技術(shù)爭論,許多人都會自問:URL、URI,很可能還有URN,它們之間的區(qū)別是什么。雖然,現(xiàn)在我們簡單地把 URN 和 URL 都看做 URI,但嚴(yán)格來說URI可以進(jìn)一步劃分為URL、URN或者這兩者的組合,所以了解這三者之間的區(qū)別將會非常有趣并讓人受益匪淺。如果你恰好在某個地方碰到了這些東西,那么至少應(yīng)該知道它們的含義。
我認(rèn)為,盡管對一般人來說,不了解這三個縮略詞之間的技術(shù)差異以及它們各自的含義并不是什么問題。但是,如果你作為一個計算機科學(xué)家、一個Web開發(fā)者、一個系統(tǒng)管理員,或者更籠統(tǒng)地說,你工作在IT領(lǐng)域,那么了解這些知識就非常有必要了。
這篇文章旨在于清楚地講解URL、URI和URN之間的區(qū)別,幫助你快速理解這些必備知識。你是不是對這個話題也感到困惑?那么我們開始吧!
起源
這三個縮略詞是Tim Berners-Lee在一篇名為RFC 3986: Uniform Resource Identifier (URI): Generic Syntax的文檔中定義的互聯(lián)網(wǎng)標(biāo)準(zhǔn)追蹤協(xié)議。
引文:
統(tǒng)一資源標(biāo)識符(URI)提供了一個簡單、可擴展的資源標(biāo)識方式。URI規(guī)范中的語義和語法來源于萬維網(wǎng)全球信息主動引入的概念,萬維網(wǎng)從1990年起使用這種標(biāo)識符數(shù)據(jù),并被描述為“萬維網(wǎng)中的統(tǒng)一資源描述符”。
Tim Berners-Lee ,萬維網(wǎng)的***,同時也是萬維網(wǎng)聯(lián)盟(W3C)的負(fù)責(zé)人。照片由 Paul Clarke 遵循CC BY-SA 4.0 協(xié)議提供。
區(qū)別
首先我們要弄清楚一件事:URL和URN都是URI的子集。
換言之,URL和URN都是URI,但是URI不一定是URL或者URN。為了更好的理解這個概念,看下面這張圖片。
通過下面的例子(源自 Wikipedia),我們可以很好地理解URN 和 URL之間的區(qū)別。如果是一個人,我們會想到他的姓名和住址。
URL類似于住址,它告訴你一種尋找目標(biāo)的方式(在這個例子中,是通過街道地址找到一個人)。要知道,上述定義同時也是一個URI。
相對地,我們可以把一個人的名字看作是URN;因此可以用URN來***標(biāo)識一個實體。由于可能存在同名(姓氏也相同)的情況,所以更準(zhǔn)確地說,人名這個例子并不是十分恰當(dāng)。更為恰當(dāng)?shù)氖菚腎SBN碼和產(chǎn)品在系統(tǒng)內(nèi)的序列號,盡管沒有告訴你用什么方式或者到什么地方去找到目標(biāo),但是你有足夠的信息來檢索到它。引自這篇文章:
所有的URN都遵循如下語法(引號內(nèi)的短語是必須的):
< URN > ::= "urn:" < NID > ":" < NSS >
其中NID是命名空間標(biāo)識符,NSS是標(biāo)識命名空間的特定字符串。
一個用于理解這三者的例子
我們來看一下上述概念如何應(yīng)用于與我們息息相關(guān)的互聯(lián)網(wǎng)。
再次引用Wikipedia ,這些引文給出的解釋,比上面人員地址的例子更為專業(yè):
關(guān)于URL:
URL是URI的一種,不僅標(biāo)識了Web 資源,還指定了操作或者獲取方式,同時指出了主要訪問機制和網(wǎng)絡(luò)位置。
關(guān)于URN:
URN是URI的一種,用特定命名空間的名字標(biāo)識資源。使用URN可以在不知道其網(wǎng)絡(luò)位置及訪問方式的情況下討論資源。
現(xiàn)在,如果到Web上去看一下,你會找出很多例子,這比其他東西更容易讓人困惑。我只展示一個例子,非常簡單清楚地告訴你在互聯(lián)網(wǎng)中URI 、URL和URN之間的不同。
我們一起來看下面這個虛構(gòu)的例子。這是一個URI:
http://bitpoetry.io/posts/hello.html#intro
我們開始分析
http://
是定義如何訪問資源的方式。另外
bitpoetry.io/posts/hello.html
是資源存放的位置,那么,在這個例子中,
#intro
是資源。
URL是URI的一個子集,告訴我們訪問網(wǎng)絡(luò)位置的方式。在我們的例子中,URL應(yīng)該如下所示:
http://bitpoetry.io/posts/hello.html
URN是URI的子集,包括名字(給定的命名空間內(nèi)),但是不包括訪問方式,如下所示:
bitpoetry.io/posts/hello.html#intro
就是這樣?,F(xiàn)在你應(yīng)該能夠辨別出URL和URN之間的不同。
如果你忘記了這篇文章的內(nèi)容,至少要記住一件事:URI可以被分為URL、URN或兩者的組合。如果你一直使用URI這個術(shù)語,就不會有錯。
為了糾正一些錯誤,已經(jīng)更新了這篇文章。如果你發(fā)現(xiàn)新的錯誤,無論是技術(shù)上的還是語法上的,請不要猶豫,告訴我們吧!