一、URL的語法
URL是互聯網資源的標准化名稱
URL提供了一種定位互聯網上任意資源的手段,但這些資源要通過不同方案(協議:比如http、ftp、smtp)來訪問,因此URL語法會略有差異
大部分URL都遵循通用的語法,而且不同URL方案風格和語法都有重疊
大多數URL協的語法都建立在下面9個部分構成的通用格式上:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
其中最重要的3個部分是:方案(scheme)、主機(host)和路徑(path)
通用URL組件:
1、方案-使用什么協議
方案:實際上規定了如何訪問指定資源的主要標識符,它告訴負責解析URL的應用程序應該是用什么協議
方案組件必須以一個字母符號開始,由第一個“:”符號將其與URL其余部分分隔開來。(方案名大小寫不敏感)
2、主機與端口
想要在往上尋找到資源,應用程序需要知道哪台機器裝載了資源,以及在機器的什么地方可以找到對目標資源進行訪問的服務器,URL的主機和端口提供這2點信息
主機組件標識了往上能訪問資源的宿主機器。可用主機名或者IP地址來表示主機名。比如下面2個URL就是指向同一個資源
主機名指向:http://joes-hardware.com:80/index.html
IP指向:161.58.228.45:80/index.html
端口組件標識了服務器正在監聽的網絡端口。對下層使用TCP協議的http協議來說,默認端口為80
3、用戶名和密碼
有些服務器都要求輸入用戶名和密碼才允許用戶訪問數據,比如FTP(文件傳輸協議),如下面幾個例子
ftp://ftp.prep.ai.mit.edu/pub/gnu
沒有用戶名和密碼,只有標准的協議、主機和路徑;如果某個應用程序使用的URL協議要求輸入用戶名密碼,但用戶沒有提供,通常會插入一個默認的用戶名和密碼,比如FTP
ftp://anonymous@ftp://ftp.prep.ai.mit.edu/pub/gnu
指定了一個用戶名anonymous,與主機組合在一起,看起來像一個email地址一樣;字符“@”將用戶名和密碼組件與其他部分分隔開來
ftp://anonymous:my_password@ftp://ftp.prep.ai.mit.edu/pub/gnu
指定了用戶名和密碼,兩者之間由字符“:”隔開
4、路徑
路徑說明了請求的資源位於服務器的什么地方,通常是一個分級的文件系統路徑;比如:
http://joes-hardware.com:80/seasona/index-fall.html
這個URL中的資源路徑就是seasona/index-fall.html,很像Unix文件系統中的文件系統路徑
路徑是服務器定位資源所需的信息,可以用“/”將http URL中的路徑組件划分為一些路徑段(path segment),每個路徑段都有自己的參數字段
5、參數
對很多協議來說,只有簡單的主機名和到達對象路徑的是不夠的,除了端口和用戶名密碼,還需要更多的內容才可以訪問
有些負責解析URL的應用程序需要協議參數才能工作;否則服務器不會提供服務,或者提供錯誤的服務,比如
ftp協議有兩種傳輸方式:二進制和文本。如果用文本形式傳送二進制圖片,結果很難預料有多糟糕
參數組件是URL中的名值隊列表,由“/”將其與其他部分分隔開,比如
ftp://ftp.prep.ai.mit.edu/pub/gnu;type=d
參數為type=d,其中參數名為type,值為d
6、查詢字符串
在我們發送請求時,很多的資源,比如數據庫服務,都可以通過查詢來縮小請求資源的類型范圍,例如
http://www.joes-hardware.com/inventoty-check.cgi?itcm-12731
問號(?)右邊的內容就是這個URL的查詢組件。URL的查詢組件和標識網關資源的URL路徑組件一起被發送給網關資源。可以將網關當做訪問其他應用程序的訪問點
如下圖:查詢目的是檢查清單中是否size為large、color為blue的條目
網關基本都是希望查詢字符串以一系列“名/值”對的形式出現,名值對之間用“&”分隔
上面的例子,查詢組件有2個名/值對:item=12731和color=blue
7、片段
有些資源類型,比如HTML,除了資源級意外,還可以進一步划分,比如一個帶有章節的大型文本文檔,資源的URL會指向整個文檔,但理想情況,可以指向資源中的章節
為了方便引用,URL允許使用片段(frag)組件來表示資源內的一個片段,片段掛在URL右邊,最前面有一個字符“#”,比如:
http://www.joes-hardware.comtools.html#drills
這個例子中,片段引用了joes-hardwareweb服務器上頁面/tools.html中的一個部分,這部分名字叫drills
服務器處理的是整個對象,URL片段僅由客戶端使用並展示
二、URL快捷方式
web可以理解並使用URL的快捷方式,比如縮略,自動擴展(用戶輸入關鍵部分,瀏覽器負責填充)
1、相對URL
URL有2種方式:絕對的和相對的。目前為止,我們使用的URL基本都是絕對的,它包含了訪問資源所需的全部信息
相對URL是不完整的,要從相對URL中獲取訪問資源的全部信息,就必須相對於另一個基礎(base)的URL進行解析
相對URL是URL的一種便捷縮略記法,下面是一個嵌入了相對URL的HTML文檔實例
<html>
<head><title>joe's tools</title></head>
<body>
<h1>tools page</h1>
<h2>hammers<h2>
<p>joe's hardware online has the largest selection of<a herp="./
hammers.html">hammers
<a/>on earth
</body>
</html>
上面的例子是資源http://www.joes-hardware.com/tools.html的HTML文檔,在這個文檔中包含了URL./hammers.html的超鏈接
雖然看起來不完整,但實際上是合法的相對URL,這個URL可以相對於它所在的文檔中的URL對其進行解釋
使用縮略形式的相對URL語法,寫HTML時就可以省略URL中的方案、主機和其他一些組件,這些組件可以從所屬資源的基礎URL中推導出來,其他資源的URL也可以用這種縮略形式來表示
下圖說明了如何從基礎URL中推導出缺失的組件信息
相對URL只是URL的片段或一小部分,處理URL的應用程序需要在相對和決定URL之間進行轉換
PS:相對URL為了保持一組資源(HTML頁面)的便捷性提供了一種便捷方式,如果使用相對URL,可以在搬移一組文檔時,仍保持鏈接的有效性;
因為相對URL是相對於新基礎進行解釋的,類似於在其他服務器提供鏡像內容等功能
1.1 基礎URL
基礎URL是作為相對URL的參考點來使用的,可以來自以下不同的地方:
在資源中顯式提供:有些資源會顯式指定基礎URL
比如:HTML文檔中可能會包含一個定義了基礎URL的HTML標記<BASE>,通過它來轉換HTML文檔中的所有相對URL
封裝資源的基礎URL:如果在一個沒有顯式指定基礎URL的資源中發現一個相對URL,如上面的HTML文檔所示,可將其所屬資源的URL作為基礎
沒有基礎URL:某些情況沒有基礎URL,一般意味着你有一個相對URL,但有時可能只是一個不完整或者損壞的URL
1.2 解析相對引用
解析:要將相對URL轉換為一個決定URL,需要將相對URL和決定URL划分成組件段,這樣,實際上只是在解析URL,但這種做法會將其划分為一個個組件,可以稱之為解析/分解URL
將基礎和相對URL划分成組件,可以下用下圖的算法來完成轉換
這個算法將一個相對URL轉換成了其絕對模式,之后,就可以用其引用資源
2、自動擴展URL
很多瀏覽器會在用戶提交URL/輸入URL時嘗試自動擴展URL,這樣為用戶提供便捷,用戶不需要輸入完整的URL,瀏覽器自動擴展
自動擴展特性有以下2種方式:
2.1 主機名擴展
只要有些小提示,瀏覽器就可以幫你將輸入的主機名擴展為完整的主機名,比如:輸入baidu,構建出www.baidu.com;弊端在於有時候會為其他http應用程序帶來問題,比如代理,后面詳細解釋
2.2 歷史擴展
將以前用戶訪問過的URL記錄儲存起來,當用戶輸入URL時將其與歷史記錄中的URL前綴進行匹配,並提供一些完整的選項供用戶選擇
PS:與代理一起使用時,URL自動擴展的行為可能有所不同,后面詳細解釋
三、URL字符集
URL是可移植的:它命名了互聯網上所有的資源,需要通過各種不同協議來傳輸資源,資源在傳輸時采取了不同的機制,因此,信息的安全傳輸就很重要
安全傳輸意味着URL傳輸不能丟失信息,但有些協議,比如SMTP(簡單郵件傳輸協議),傳輸方法就是剝去一些特點的字符
URL是可讀的:因此,即使不可見、不可打印的字符能穿過郵件程序,從而成為可移植的,也不能在URL中使用
URL是完整的:有人希望URL中包含初通用的安全字母表之外的二進制數據或字符,因此需要一種轉義機制,將不安全的字符編碼為安全字符再傳輸
1、URL字符集
1.1 很多計算機應用程序使用的都是ASCII字符集,ASCII使用7位二進制碼來表示大多數按鍵和少數不可控字符,其移植性也很好,但考慮到全球用戶太多,以及有時候URL中會包含任意二進制數據
就需要將轉義序列集成進來,通過轉義序列將ASCII字符集的有限子集對任意字符值或數據進行編碼,這樣就實現了可移植和完整性
1.2 編碼機制
為了避開安全字符集帶來的限制,人們設計了“轉義”表示法來表示不安全字符,其中包含一個百分號(%),后面跟2個表示字符ASCII碼的十六進制數,下面是幾個例子
1.3 字符限制
URL中,有幾個字符被保留起來,有着特殊含義。有些字符不在定義的ASCII字符集中,還有些字符會和某些協議網關產生混淆,因此不贊成使用
四、常見協議
下面附錄一個關於常用常見的協議列表
五、URL未來發展
URL可用來命名所有現存對象,其還提供一種可在各種協議間共享的統一命名機制,但並不完美;因為URL只表示實際地址,而不是准確的名字,意味着如果資源地址有變化,URL就無法對其進行定位
永久統一資源定位符(PURL),其本質是搜索資源過程中引入一個中間層,通過一個中間資源定位符(resource locator)服務器對資源的實際URL進行登記和追蹤
客戶端可以向定位符請求一個永久的URL,定位符可以以一個資源為響應,將客戶端重定向到資源當前的URL去