URL 和 URI 有什麼不同?


URL 是 URI 的子集。任何東西,只要能夠唯一地標識出來,都可以說這個標識是 URI 。如果這個標識是一個可獲取到上述對象的路徑,那麼同時它也可以是一個 URL ;但如果這個標識不提供獲取到對象的路徑,那麼它就必然不是 URL 。


一句話解釋:URI 和 URL 都定義了 what the resource is。URL 還定義了 how to get the resource。


已經有很多回答給出了 URI 的 RFC(RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax)中所述的 URI 與 URL 的關係,雖然不能說這是不對的,但這並不是當下的主要矛盾所在

為什麼說很多回答里給了 RFC 里的陳述沒什麼用呢?因為現在實質上出現的 URI 和 URL 並不是指的 RFC 3986 中所述的 URI 和 URL,而是 RFC 3986 中的 URI 與 WHATWG 規範中的 URL(URL Standard)。

或者說的更簡單一些,IETF 傾向於使用 URI 這個名詞作為這個通用形式的名稱,而 WHATWG 傾向於使用 URL 這個名詞作為通用形式的名稱

URL Standard

Goals

The URL standard takes the following approach towards making URLs fully interoperable:

  • Align RFC 3986 and RFC 3987 with contemporary implementations and obsolete them in the process. (E.g., spaces, other "illegal" code points, query encoding, equality, canonicalization, are all concepts not entirely shared, or defined.) URL parsing needs to become as solid as HTML parsing. [RFC3986][RFC3987]

  • Standardize on the term URL. URI and IRI are just confusing. In practice a single algorithm is used for both so keeping them distinct is not helping anyone. URL also easily wins the search result popularity contest.

  • Supplanting Origin of a URI [sic].[RFC6454]

  • ...

簡單翻譯就是,我們要大一統那些寫的爛的 RFC 規範。另外,URL 和 URI 兩個概念太麻煩了,所以大家都別用 URI 了,都用 URL 就好。

所以目前的現狀是,IETF based 協議規範中用的多是 URI,比如 RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing ;而 WHATWG based 語言規範中大多是 URL,比如 HTML Standard 。所以從規範上來說寫在 href 屬性里的內容是 URL,但瀏覽器發送的 HTTP 請求首行中的內容是 URI,哪怕它們(不考慮 HTTP 非 Proxy 請求會把 Host 單獨寫 Header 里的情況下)完全一樣(在各自獨立的規範中的定義里)也是兩個東西。

至於說語法,兩邊都有獨立的語法定義:RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax,URL Standard。兩者的目標都是通用形式,在日常使用中並沒有可觀測的區別。

所以,這就是一個簡單的一個站隊問題。如果你支持 IETF,你可以說 URL 就是 URI 的一個符合特定語義的子集;如果你支持 WHATWG,你可以說 URI 就是一個裝逼人士的過時叫法,現在的 URL 就是完全取代 URI 的概念。

當然,實際上 WHATWG 就是一個笑話,其作用只是說凡是 Web 技術的發展都必須遵循我們瀏覽器廠商的事實標準,不然你規範寫的再好也沒有用。該站哪隊就不點明了,所以具體到某個地方使用了 URI 或 URL 表示什麼意思得看出處。如果看到 Web 方面的規範中用 URL,直接理解為它說的就是 URI 只是它就是偏不想叫 URI 這樣就行了。


URI是用來標識網上的資源的

URI分為URL和URN這兩大類。

URL與URN的不同之處在於前者不僅標識資源,而且還指出了訪問資源的方式。比如採用何種協議(http,ftp...),而URN則沒有。

關於URI,詳見RFC3986

關於URN,詳見RFC2141


什麼是URI

Web上可用的每種資源 - HTML文檔、圖像、視頻片段、程序等 - 由一個通過通

用資源標誌符(Universal Resource Identifier, 簡稱"URI")進行定位。

什麼是URL:

URL是Uniform Resource Location的縮寫,譯為「統一資源定位符」。通俗地說,URL是Internet上用來描述信息資源的字元串,主要用在各種WWW客戶程序和伺服器程序上,特別是著名的Mosaic。採用URL可以用一種統一的格式來描述各種信息資源,包括文件、伺服器的地址和目錄等。

區別就是URI定義資源,而URL不單定義這個資源,還定義了如何找到這個資源。 比如說,一個伺服器上,到一個文件夾/網頁的絕對地址(absolute path)就是URI。


URI (Identifier) 只讓你可以"區別"資源
URL (Locator) 還讓你可以"找到"資源 (所以URL比一般的URI更"強", 是URI的子集)

比如人的身份證號是 (非Locator的) Identifier: 不同身份證號一定是不同人, 但是用身份證號本身是找不到人的。這個人的住址或座標才是Locator。


URI和URL及URN的區別

對於URL,大家都比較熟悉,其他兩個詞就比較陌生了。URI、URL和URN是識別、定位和命名互聯網上的資源的標準途徑。1989年Tim Berners-Lee發明了互聯網(World Wide Web)。WWW被認為是全球互連的實際的和抽象的資源的集合–它按需求提供信息實體–通過互聯網訪問。實際的資源的範圍從文件到人,抽象的資源包括資料庫查詢。

因為要通過多樣的方式識別資源(人的名字可能相同,然而計算機文件只能通過唯一的路徑名稱組合訪問),所以需要標準的識別WWW資源的途徑。為了滿足這種需要,Tim Berners-Lee引入了標準的識別、定位和命名的途徑:URI、URL和URN。

  • URI:Uniform Resource Identifier,統一資源標識符;
  • URL:Uniform Resource Locator,統一資源定位符;
  • URN:Uniform Resource Name,統一資源名稱。

在這個體系中的URI、URL和URN是彼此關聯的。URI的範疇位於體系的頂層,URL和URN的範疇位於體系的底層。這種排列顯示URL和URN都是URI的子範疇。

三者中,其中URL和URI特別容易混淆。

URL是Internet上用來描述信息資源的字元串,主要用在各種WWW客戶程序和伺服器程序上。採用URL可以用一種統一的格式來描述各種信息資源,包括文件、伺服器的地址和目錄等。

URL的格式由下列三部分組成:

  1. 協議(或稱為服務方式);
  2. 存有該資源的主機IP地址(有時也包括埠號);
  3. 主機資源的具體地址。如目錄和文件名等。

第一部分和第二部分之間用」://」符號隔開,第二部分和第三部分用」/」符號隔開。第一部分和第二部分是不可缺少的,第三部分有時可以省略。

目前最大的缺點是當信息資源的存放地點發生變化時,必須對URL作相應的改變。因此人們正在研究新的信息資源表示方法。

URI是以某種統一的(標準化的)方式標識資源的簡單字元串,一般由三部分組成:

  1. 訪問資源的命名機制。
  2. 存放資源的主機名。
  3. 資源自身的名稱,由路徑表示。

典型情況下,這種字元串以scheme開頭,語法如下:

[scheme:] scheme-specific-part

http://www.google.com,其中http是scheme,//http://www.google.com是 scheme-specific-part,並且它的scheme與scheme-specific-part被冒號分開了。

有的URI指向一個資源的內部。這種URI以」#」結束,並跟著一個anchor標誌符(稱為片斷標誌符)。

相對URI不包含任何命名規範信息。它的路徑通常指同一台機器上的資源。相對URI可能含有相對路徑(如:「..」表示上一層路徑),還可以包含片斷標誌符。

URI的常見問題

  • 難以輸入,URI不必要的冗長。
  • 莫明其妙的大寫字母。
  • 不常見的標點符號。
  • 在紙介質上顯示很困難,一些字元在紙上列印出來不容易辨認。
  • 主機和埠的問題除了 scheme-specific 部分,domain 和port 也可能給用戶帶來困惑。

設計URI應該遵循的規則(具體還可以參考上一篇:優秀的URI不會改變)

URI 是網站UI的一部分,因此,可用的網站應該滿足這些URL 要求

  • 簡單,好記的域名
  • 簡短(short)的URI
  • 容易錄入的URI
  • URI 能反應站點的結構
  • URI 是可以被用戶猜測和hack的(也鼓勵用戶如此)
  • 永久鏈接,Cool URI don』t change

聰明的選擇URI

一定要短 為了URI能被方便的錄入,寫下,拼寫和記憶,URI 要儘可能的短,根據w3c 提供的參考數據,一個URI 的長度最好不要超過80個位元組(這並非一個技術限制,經驗和統計提供的數據),包括schema 和host,port 等。

大小寫策略 URI的大小寫策略要適當,要麼全部小寫,要麼首字母大寫,應避免混亂的大小寫組合,在Unix 世界,文件路徑隊大小寫是敏感的,而在Windows 世界,則不對大小寫敏感。

允許URI管理 URI映射 管理員可以重新組織伺服器上的文件系統結構,而無需改動URI,這就需要URI和真實的伺服器文件系統結構之間有一個映射機制。,而不是生硬的對應。這種映射機制可以通過如下技術手段實現:

  • Aliases ,別名,Apache 上的目錄別名,IIS 上的虛擬目錄
  • Symbolic links ,符號鏈接,Unix 世界的符號鏈接
  • Table or database of mappings ,資料庫映射,URI 和文件系統結構的對應關係存儲在資料庫中。

標準的重定向 管理員可以簡單的通過修改HTTP 狀態代碼來實現伺服器文件系統結構變更之後的URI兼容,可以利用的HTTP Status Code 有:

  • 301 Moved Permanently ([RFC2616] section 10.3.2)
  • 302 Found (undefined redirect scheme, [RFC2616] Section 10.3.3)
  • Temporary Redirect ([RFC2616] Section 10.3.8)

用獨立的URI

技術無關的URI

  • 提供動態內容服務時,應使用技術無關的URI。即URI不暴露伺服器端使用的腳本語言,平台引擎,而這些語言,平台,引擎的變化也不會導致URI的變更。因此,sevelet,cgi-bin之類的單詞不應該出現在URI 中。
  • 提供靜態內容服務時,應當隱去文件的擴展名取而代之的技術是content-negotiation, proxy, 和URI mapping

身份標誌和Session 機制

  • 使用標準的身份認證機制,而不是每個用戶一個特定的URI
  • 使用標準的Session 機制,而不是把Session ID 放在URI 中使用。

內容變更時使用標準轉向

  • 對變更的內容使用標準的重定向
  • 對刪除的資源使用 HTTP410

提供索引代理

索引策略

  • Content-Location
  • Content-MD5

提供適當的緩存信息

  • 緩存相關的HTTP頭
  • 緩存策略
  • 緩存生成內容 HTTP HEAD和HTTP GET

總結

  • URI 是Web UI 的一部分,應當像對待網站Logo 和公司品牌一樣對待它
  • URI 是網站和普通用戶之間的唯一介面,應當像對待你的商務電話號碼一樣對待它

讀懂並記住上面兩句話,你下次設計URI 的時候就會給它應有的重視了。

  • URL 應當是用戶友好的
  • URI 應當是可讀的
  • URI 應當是可預測的
  • URI 應當是統一的

讀懂和記住上面四句話,你就知道應該設計什麼樣的URI了。


A URL is a specific type of URI.

A URL implies the means to access an indicated resource, which is not true of every URI.

https://en.wikipedia.org/wiki/Uniform_Resource_Locator


最簡單易懂的:

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

URI - /some/page.html

我不寫答案,我只是stackoverflow的搬運工 :D

http - What is the difference between a URI, a URL and a URN


URI,統一資源標識符,首先它是一個字元串。其次,它是一個可以唯一標識某一資源的字元串。

URL,統一資源定位符,首先,它是一種URI,其次,它可以標識資源的路徑。

URN,統一資源名,首先,它是一種URI,其次,它代表資源的名字。


正好這幾天在看HTTP權威指南,遇到了URL與URI和URN的概念,所以就來回答了

下面分別對URI,URN,URL做解釋:

URI:Uniform Resource Identifier (統一資源標識符):用一個緊湊的字元串用來標示抽象或物理資源

也就是說,URI只是規定如何標識資源,沒有規定如何獲取資源 也就是what the resource is but i don"t care how to get the resource

URL:Uniform Resource Locator (統一資源定位符):URL是URI最常見的表現形式.它明確說明如何從一個精準、固定的位置獲取資源

URL不但規定了如何標識資源,還規定了如何獲取資源..也就是what the resource is how to get the resource

URL遵循以下格式,來自HTTP權威指南的節選

URN:Uniform Resource Name (統一資源名稱):URN作為特定內容的唯一名稱使用,與目前的資源所在地無關,使用這些與位置無關的URN,就可以將資源到處搬移

也就是I know the resource name and get the resource,but you don"t need to know how can i do.

通過URN,可以使用相同一個名字通過多種網路訪問協議來訪問資源

不過,現在還只是試驗階段,並沒有大規模使用..因為URN需要一個支撐架構來解析資源的位置,目前還缺乏類似的架構支持

URN一般都是urn: 作為開頭

所以,三者的關係如下圖

A URI has two specializations known as URL and URN.

URI是URL與URN的父類,URI是抽象的表現,他們的關係就像蝴蝶都會飛,但會飛的可不都是蝴蝶.

所有的URL與URN都是URI,但是URI不一定就是URL或者URN

舉例說明:

URI:

以下(URL|RUN)都是URI

URL:

  • http://example.com/mypage.html
  • ftp://example.com/download.zip
  • mailto:user@example.com
  • file:///home/user/file.txt
  • http://example.com/resource?foo=bar#fragment

URN:

  • urn:isbn:0451450523 書的ISBN編碼

可以參考一下StackOverflow關於這個問題的討論:What is the difference between URI, URL and URN?

有個常見QA挺好的,希望對你有幫助:)


這是一個既不是 URL 也不是 URN 的 URI:

magnet:?xt=urn:btih:0000000000000000000000000000000000000000tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80%2Fannounce

其中有一個 URN:

urn:btih:0000000000000000000000000000000000000000

還有一個 URL:

udp://tracker.openbittorrent.com:80/announce


URL是locator

包含了如何access的含義在裡面

URI如:my:123

但怎麼獲取這個資源呢?要URL


我看了一篇不錯的文章就是講URL和URI區別的,可以看的博客:[譯]URL和URI的區別


試著答一下,不對還請指出。

假設,現在是一個沒有身份證的社會,而國家希望通過設計一個身份證來標明每一個人。那麼這個身份證就是URI,因為國家希望通過這個身份證(通過統一資源標識符),就可以找到一個特定的人。

如果咱們的身份證是這麼設計的:第一種方案:只有一串身份證號,其他的什麼都沒有,第二種方案,詳細的描述了你的地址,xx省xx市xx區xx街道xx單元xx門xxx室。

那麼第一種方案,就可以稱之為 URN(uniform resource name 統一資源名稱);

第二種方案 ,就可以稱之為 URL(uniform resource locator 統一資源定位符)。

大概就是這樣


瀏覽了很多關於uri和url文章之後,發現百度百科的一段話,個人覺得是總結的還可以的,引用如下:

URI是以某種統一的(標準化的)方式標識資源的簡單字元串。

典型情況下,這種字元串以scheme(命名URI的名字空間的標識符——一組相關的名稱)開頭,語法如下:

[scheme:] scheme-specific-part

URI以scheme和冒號開頭。Scheme用大寫/小寫字母開頭,後面為空或者跟著更多的大寫/小寫字母、數字、加號、減號和點號。冒號把scheme與scheme-specific-part分開了,並且scheme-specific-part的語法和語義(意思)由URI的名字空間決定。如下面的例子:

http://域名,其中http是scheme,//域名 是scheme-specific-part,並且它的scheme與scheme-specific-part被冒號分開了。

URI有絕對和相對之分,絕對的URI指以scheme(後面跟著冒號)開頭的URI。前面提到的http://域名 就是絕對的URI的一個例子,其它的例子還有mailto:xxx@xxx.xx、news:地址和xyz://whatever。你可以把絕對的URI看作是以某種方式引用某種資源,而這種方式對標識符出現的環境沒有依賴。如果使用文件系統作類比,絕對的URI類似於從根目錄開始的某個文件的徑。

與絕對的URI不同的,相對的URI不是以scheme(後面跟著冒號)開始的URI。 它的一個例子是articles/articles.html。你可以把相對的URI看作是以某種方式引用某種資源,而這種方式依賴於標識符出現的環境。如果用文件系統作類比,相對的URI類似於從當前目錄開始的文件路徑。

URL是Uniform Resource Location的縮寫,譯為"統一資源定位符"。通俗地說,URL是Internet上用來描述信息資源的字元串,主要用在各種WWW客戶程序和伺服器程序上,特別是著名的Mosaic。採用URL可以用一種統一的格式來描述各種信息資源,包括文件、伺服器的地址和目錄等。

目前最大的缺點是當信息資源的存放地點發生變化時,必須對URL作相應的改變。因此人們正在研究新的信息資源表示方法,例如:URI(Universal Resource Identifier)即"通用資源標識"(參見RFC 1630)、URN(Uniform Resource Name)即"統一資源名"和URC(Uniform Resource Citation)即"統一資源引用符"等。

URI還在進一步的研究當中。研究的方向就是彌補URL的缺點。


我來回答下:

URI :張三

URL : 浙江省杭州市江干區下沙某大學18號樓某寢室1號床的張三


我也看了很多關於Url和Uri的區別的文章 我都理解不了 但看多了有點自己的理解

Uri是Url抽象的 Url是Uri具體的

比如用Uri抽象運輸工具:一個結實是載體+一個動力系統+足夠輪胎或履帶

Url具體描述運輸工具中的汽車:車架+發動機+4個輪胎

用Url描述奧迪公司的汽車:奧迪汽車的車廂+奧迪公司的發動機+奧迪公司的4個輪胎


URI用字元串標識某一互聯網資源,URL標識資源的地點,也就是互聯網上所處的位置,是一個路徑。

所以URL是URI的一個子集。


我來舉個例子方便大家理解。

  • URL(統一資源定位)是根據位置來查找資源,就好比是一個郵寄地址,例如:上海市xx區xx小區xx幢xx單元xx室,快遞員根據這個地址就能準確把郵件送到你家;同理,瀏覽器向伺服器發送請求http://www.xxx.com/user/user.jpg,伺服器端根據這個請求的地址就可以準確找到你要請求的資源;
  • URN(統一資源命名)是根據名稱來查找資源,就好比是用身份證號碼來唯一識別一個人,無論你以後去了哪裡,只要身份證不變都可以找到你。同理,伺服器的有些資源路徑是經常變動的,此時用URL來定位可能會出現資源找不到異常,所以此時用名稱來查找就會比較方便些了。

URL和URN都屬於URI(統一資源標識符),URI是更加抽象和廣義的概念,而URL和URN是具體的基於URI的一種實現。


推薦閱讀:

遇見和邂逅有什麼區別?
「城市規劃」和「城鄉規劃」有什麼區別?「城鄉規劃」的前景如何?
喬任梁真的討厭徐璐嗎?
貧和幽默是一回事嗎?
知識和經驗有什麼區別?

TAG:前端開發 | A和B有什麼不同 |