1. 程式人生 > 其它 >1.7 URI 和 URL

1.7 URI 和 URL

1.7 URI 和 URL

​ 與URI(統一資源識別符號)相比,我們更熟悉URL(Uniform Resource Locator,統一資源定位符)。URL 正是使用 Web 瀏覽器等訪問 Web 頁面時需要輸入的網頁結構。比如,http://hackr.jp/ 就是URL

1.7.1 統一資源識別符號

URIUniform Resource Identifier 的縮寫。RFC2396 分別對這 3 個單詞進行了如下定義。

Uniform

規定統一的格式可方便處理多種不同型別的資源,而不用根據上下文環境來識別資源指定的訪問方式。另外,加入新增的協議方案(如 http:ftp:

)也更容易

Resource

資源的定義是“可標識的任何東西”。除了文件檔案、影象或服務(例如當天的天氣預報)等能夠區別於其他型別的,全都可作為資源。另外,資源不僅可以是單一的,也可以是多數的集合體。

Identifier

表示可標識的物件。也稱為識別符號。


綜上所述,URI 就是某個協議方案表示的資源的定位識別符號。協議方案是指訪問資源所使用的協議型別名稱。

​ 採用 HTTP 協議時,協議方案就是 http。除此之外,還有 ftp、mailto、telnet、file等。標準的 URI 協議方案有 30 種左右,由隸屬於國際網際網路資源管理的非盈利社團 ICANN(Internet Corporation for Assigned Names and Numbers,網際網路名稱與數字地址分配機構)的 IANA (Internet Assigned Numbers Authority,網際網路號碼分配局)

管理頒佈。

URI 用字串標識某一網際網路資源,而 URL 標識資源的地點(網際網路上的位置)。可見 URLURI 的子集。

“RFC3986:統一資源識別符號(URI)通用語法”中列舉了幾種 URI 例子,如下所示。

ftp://ftp.is.co.za/rfc/rfc1808.txt
http://www.ietf.org/rfc/rfc2396.txt
ldap://[2001:db8::7]/c=GB?objectClass?one
mailto:[email protected]
news:comp.infosystems.www.servers.unix
tel:+1-816-555-1212
telnet://192.0.2.16:80/
urn:oasis:names:specification:docbook:dtd:xml:4.1.2

1.7.2 URI 格式

​ 表示指定的URI,要使用涵蓋全部必要資訊的絕對 URI、絕對 URL 以及相對 URL 。相對 URL,是指從瀏覽器中基本 URI處指定的 URL ,形如 /image/logo.gif。

​ 使用 http:https: 等協議方案名獲取資源時要指定協議型別。不區分字母大小寫,最後附一個冒號( : )

​ 也可使用data:javascript: 這類指定資料或指令碼程式的方案名

登入資訊(認證)

指定使用者名稱和密碼作為從伺服器端獲取資源時必要的登入資訊(身份認證)。此項是可選項。

伺服器地址

使用絕對 URI 必須指定待訪問的伺服器地址。地址可以是類似 hackr.jp 這種 DNS 可解析的名稱,或是 192.168.1.1 這類 IPv4 地址名,還可以是[0:0:0:0:0:0:0:1] 這種用方括號括起來的 IPv6 地址名。

伺服器埠名

指定伺服器連線的網路埠號。此項也是可選項,若使用者省略則自動使用預設埠號。

帶層次的檔案路徑

指定伺服器上的檔案路徑來定位特指的資源。這與 UNIX 系統的檔案目錄結構相似。

查詢字串

針對已指定的檔案路徑內的資源,可以使用查詢字串傳入任意引數。此項可選

片段識別符號

使用片段識別符號通常可標記出已獲取資源中的子資源(文件內的某個位置)。但在 RFC 中並沒有明確規定其使用方法。該項也為可選項。


並不是所有的應用程式都符合 RFC

​ 有一些用來制定 HTTP 協議技術標準的文件,它們被稱為 RFC(Request for Comments,徵求修正意見書)。

​ 通常,應用程式會遵照有 RFC 確定的標準實現。可以說, RFC是網際網路的設計文件,鑰匙不按照 RDC標準執行,就有可能導致無法通訊的狀況。比如,有一臺 Web 伺服器內的應用服務沒有遵照 RFC 的標準實現,那 Web 瀏覽器就很可能無法訪問這臺伺服器。

​ 由於不遵照 RFC 標準實現就無法進行 HTTP 協議通訊,所以基本上客戶端和伺服器端都會以 RFC 為標準來實現 HTTP 協議。但也存在某些應用因客戶端或伺服器端的筆筒,而未遵照 RFC 標準,反而將自成一套的“標準”擴充套件的情況。

​ 不按 RFC 標準來實現,當然也不必勞心費力讓自己的“標準”符合其他所有的客戶端和伺服器端。但設想一下,如果這款應用程式的使用者非常多,那會發生什麼情況?不難想象,其他的客戶端或伺服器端必然都不得不去配合它。

​ 實際在網際網路上,已經實現了 HTTP 協議的一些伺服器端和客戶端裡就存在上述情況。