第一部分 HTTP:Web的基礎——第2章 URL與資源

本章主要內容:

  • URL語法,以及各種URL組件的含義及其所做的工作;
  • 很多Web客戶端都支持的URL快捷方式,包括相對URL和自動擴展URL
  • URL編碼和字符規則;
  • 支持各種因特網信息系統的常見URL方案;
  • URL的未來,包括URN——這種框架可以在對象從一處搬到另一處時,保持穩定的訪問名稱。

2.1 瀏覽因特網資源

URL是瀏覽器尋找信息時所需的資源位置。
URL是人們對HTTP和其他協議的常用訪問點:一個人將瀏覽器指向一個URL,瀏覽器就會在幕後發送適當的協議報文來獲取人們所期望的資源。

URI是一類更通用的資源標識符,URL實際上是它的一個子集。URI是一個通用的概念,由兩個主要的子集URLURN構成,URL是通過描述資源的位置來標識資源的,而URN則是通過名字來標識符資源的,與它們當前所處位置無關。

HTTP規範將更加通用的概念URI作爲其資源標識符,但實際上,HTTP應用程序處理的只是URIURL子集。

URL的組成部分

示例URL:http://www.joes-hardware.com/seasonal/index-fall.html。

  • URL的第一部分(http)是URL方案(scheme)。方案可以告知Web客戶端怎樣訪問資源。
  • URL的第二部分(www.joes-hardware.com)指的是服務器的位置。這部分告知Web客戶端資源位於何處。
  • URL的第三部分(/seasonal/index-fall.html)是資源路徑。路徑說明了請求的是服務器上哪個特定的本地資源。

示例圖:
在這裏插入圖片描述
URL可以通過HTTP之外的其他協議來訪問資源。它們可以指向因特網上的任意資源,或者個人的E-mail賬戶:
mailto:[email protected]
或者通過其他協議(比如FTP協議)訪問的各種文件:
ftp://ftp.lots-o-books.com/pub/complete-price-list.xls
或者從流視頻服務器上下載電影:
rtsp://www.joes-hardware.com:554/interview/cto_video

URL提供了一種統一的資源命名方式。多數URL都有同樣的:“方案://服務器位置/路徑”結構。

2.2 URL的語法

多數URL方案的URL語法都建立在這由9部分構成的通用格式上:

<scheme>://<user>:<password>@<host>:<port>/<path>;<param>?<query>#<frag>

URL最重要的3個部分是方案(scheme)、主機(host)和路徑(path)。

通用URL組件

組件 描述 默認值
方案 訪問服務器以獲取資源時要使用哪種協議
用戶 某些方案訪問資源時需要的用戶名 匿名
密碼 用戶名後面可能要包含的密碼,中間由冒號(:)分隔 <E-mail 地址>
主機 資源宿主服務器的主機名或點分IP地址
端口 資源宿主服務器正在監聽的端口號。很多方案都有默認端口號(http的默認端口號爲80) 每個方案特有
路徑 服務器上資源的本地名,由一個斜槓(/)將其與前面的URL組件分隔開來。路徑組件的語法是與服務器和方案有關的(URL路徑可以分爲若干個段,每個段都可以有其特有的組件)
參數 某些方案會用這個組件來指定輸入參數。參數爲名/值對。URL中可以包含多個參數字段,它們之間以及與路徑的其餘部分之間用分號(;)分隔
查詢 某些方案會用這個組件傳遞參數以激活應用程序(比如數據庫、公告板、搜索引擎以及其他因特網網關)。查詢組件的內容沒有通用格式。用字符“?”將其與URL的其餘部分分隔開來
片段 一小片或一部分資源的名字。引用對象時,不會將frag字段傳給服務器;這個字段是在客戶端內部使用的。通過字符“#”將其與URL的其餘部分分隔開來
2.2.1 方案——使用什麼協議
  • 方案實際上是規定如何訪問指定資源的主要標識符,它會告訴負責解析URL的應用程序應該使用什麼協議。
  • 方案組件必須以一個字母符號開始,由第一個“:”符號將其與URL的其餘部分分隔開來。方案名是大小寫無關的,URL“http://www.sina.com”和"HTTP://www.sina.com"是等價的。
2.2.2 主機與端口

主機組件標識了因特網上能夠訪問資源的宿主機器。
可以用主機名或者IP地址來表示主機名。
示例

http://www.joes-hardware.com:80/index.html  
http://161.58.228.45:80/index.html

上面的兩個URL都是指向同一個資源——第一個URL是通過主機名,第二個是通過IP地址指向服務器的。
HTTP協議的默認端口號爲80。

2.2.3 用戶名和密碼

更有趣的組件是用戶和密碼組件。很多服務器都要求輸入用戶名和密碼纔會允許用戶訪問數據。FTP服務器就是這樣一個常見的實例。如下示例:

ftp://ftp.prep.ai.mit.edu/pub/gnu
ftp://[email protected]/pub/gnu
ftp://anonymous:[email protected]/pub/gnu
http://joe:[email protected]/sales_info.txt

示例一沒有用戶或密碼組件,只有標準的方案、主機和路徑。如果某些應用程序使用的URL方案要求輸入用戶名和密碼,比如FTP,但用戶沒有提供,它通常會插入一個默認的用戶名和密碼。比如,如果向瀏覽器提供一個FTP URL,但沒有指定用戶名和密碼,就會插入anonymous(匿名用戶)作爲你的用戶名,併發送一個默認的密碼(Internet Explorer會發送IEUser,Netscape Navigator則會發送mozilla)。

示例二顯示了一個指定爲anonymous的用戶名。這個用戶名與主機組件組合在一起,看起來就像E-mail地址一樣。字符“@”將用戶和密碼組件與URL的其餘部分分隔開來。

示例三,指定了用戶名(anonymous)和密碼(my_passwd),兩者之間由字符“:”分隔。

2.2.4 路徑

URL的路徑組件說明了資源位於服務器的什麼地方。路徑通常很像一個分級的文件系統路徑。比如:

http://www.joes-hardware.com:80/seasonal/index-fall.html

這個URL中的路徑爲/seasonal/index-fall.html,很像UNIX文件系統中的文件系統路徑。路徑是服務器定位資源時所需的信息。

2.2.5 參數

爲了嚮應用程序提供它們所需的輸入參數,以便正確地與服務器進行交互,URL中有一個參數組件。這個組件就是URL中的名值對列表,由字符“;”將其與URL的其餘部分(以及各名值對)分隔開來。它們爲應用程序提供了訪問資源所需的所有附加信息。例如:

ftp://prep.ai.mit.edu/pub/gnu:type=d

例子中,有一個參數type=d,參數名爲type,值爲d。
如前所述,HTTP URL的路徑組件可以分成若干路徑段。每段都可以有自己的參數。比如:

http://www.joes-hardware.com/hammers;sale=false/index.html;graphics=true

例子中有兩個路徑段,hammers和index.html。hammers路徑段有參數sale,其值爲false。index.html段有參數graphics,其值爲true。

2.2.6 查詢字符串
http://www.joes-hardware.com/inventory-check.cgi?item=12731

這個URL與我們見過的其他URL類似。只有問號(?)右邊的內容是新出現的。這部分被稱爲查詢(query)組件。URL的查詢組件和標識網關資源的URL路徑組件一起被髮送給網關資源。基本上可以將網關當作訪問其他應用程序的訪問點。

2.2.7 片段

有些資源類型,比如HTML,除了資源級之外,還可以做進一步的劃分。比如,對一個帶有章節的大型文本文檔來說,資源的URL會指向整個文本文檔,但理想的情況是,能夠指定資源中的那些章節。

爲了引用部分資源或資源的一個片段,URL支持使用片段(frag)組件來表示一個資源內部的片段。比如,URL可以指向HTML文檔中一個特定的圖片或小節。片段掛在URL的右手邊,最前面有一個字符“#”。如

http://www.joes-hardware.com/tools.html#drills

例子中,片段drills引用了Joe的五金商店Web服務器上頁面/tools.html中的一個部分。這部分的名字爲drills。

HTTP服務器通常只處理整個對象,而不是對象的片段,客戶端不能將片段傳送給服務器。瀏覽器從服務器獲得了整個資源之後,會根據片段來顯示你感興趣的那部分資源。

URL片段僅由客戶端使用

2.3 URL快捷方式

Web客戶端可以理解並使用幾種URL快捷方式。相對URL是在某資源內部指定一個資源的便捷縮略方式。很多瀏覽器還支持URL的“自動擴展”,也就是用戶輸入URL的一個關鍵部分,然後由瀏覽器將其餘部分填充起來。

2.3.1 相對URL

URL的兩種方式:

  • 相對URL
  • 絕對URL

絕對URL中包含有訪問資源所需的全部信息。
相對URL是不完整的。要從相對URL中獲取訪問資源所需的全部信息,就必須相對於另一個,被稱爲其基礎(base)的URL進行解析。

使用縮略形式的相對URL語法,HTML的編寫者就可以省略URL中的方案、主機和其他一些組件了。這些組件可以從它們所屬資源的基礎URL中推導出來。其他資源URL也可以用這種縮略形式來表示。

2.3.2 自動擴展URL

有些瀏覽器會在用戶提交URL之後,或者在用戶輸入的時候嘗試着自動擴展URL。這就爲用戶提供了一條捷徑:用戶不需要輸入完整的URL,因爲瀏覽器會自動擴展。
這些“自動擴展”特性有以下兩種方式。

  • 主機名擴展
  • 歷史擴展

與代理共同使用時,URL自動擴展的行爲可能會有所不同。

2.4 各種令人頭疼的字符

2.4.1 URL字符集
2.4.2 編碼機制

編碼機制就是通過一種“轉義”表示法來表示不安全字符的,這種轉義表示法包含一個百分號(%),後面跟着兩個表示字符ASCII碼的十六進制數。

2.4.3 字符限制

保留及受限的字符

字符 保留/受限
% 保留作爲編碼字符的轉義標誌
/ 保留作爲路徑組件中分隔路徑段的定界符
. 保留在路徑組件中使用
保留在路徑組件中使用
# 保留作爲分段定界符使用
? 保留作爲查詢字符串定界符使用
; 保留作爲參數定界符使用
: 保留作爲方案、用戶/口令,以及主機/端口組件的定界符使用
$,+ 保留
@&= 在某些方案的上下文中有特殊的含義,保留
{}|^~[]’ 由於各種Agent代理,比如各種網關的不安全處理,使用受限
<>" 不安全;這些字符在URL範圍之外通常是有意義的,比如在文檔中對URL自身進行定界(比如“http://www.joes-hardware.com”),所以應該對其進行編碼
0x00-0x1F,0x7F 受限,這些十六進制範圍內的字符都在US-ASCII字符集的不可打印區間內
>0x7F 受限,十六進制值在此範圍內的字符都不在US-ASCII字符集的7比特範圍內
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章