Http權威指南筆記(二)——URL與資源

其實在我們生活中,有很多標準化命名規範,如:街道地址,書籍的ISBN號等。所謂的標準化命名規範,就是按照一定的規則對資源進行命名,以便通過名稱就能定位資源的一種規範。我們接下來學習的URL也是一種標準化命名規範。

1 URL簡介

URL 是瀏覽器尋找信息時所需的資源位置。通過 URL,人類和應用程序才能找到、使用並共享因特網上大量的數據資源。
URL是作爲URI的一個子集,URI是一類更通用的資源標識符,主要是由URL和URN構成。HTTP 規範將更通用的概念 URI 作爲其資源標識符,但實際上,HTTP 應用程序處理的只是 URI 的 URL 子集。URL主要內容由三部分組成,在第一篇——概述中已經介紹過了。

2 URL語法

URL提供了一種定位Internet上資源的手段。但是這些資源可以通過不同的Scheme進行訪問(如:HTTP, FTP, STMP),同時使用的Schema不同,URL的語法也會有一定程度的差異。雖然有差異,但是大部分URL都會遵循如下規則:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
但是一般看到的URL都不會完整包含全部內容,一般都只是其中某些部分的組合。下表是對每個部分的說明:

組件 描述 默認值
scheme 訪問服務器以獲取資源時要使用哪種協議
user 某些scheme訪問資源時需要用戶名 anonymous
password 用戶名後面可能要包含的密碼,中間用’:'隔開 和客戶端相關
host 資源宿主服務器的域名或者點分IP地址
port 資源宿主服務器正在監聽的端口,很多scheme都有自己默認的端口
如:HTTP默認端口爲80
每個方案特有
path 服務器上資源的本地路徑,由一個斜槓(/)將其與前面的組件分割開來
path組件是與服務器和scheme有關
params 某些scheme會用該組件來指定參數,參數爲name/value形式,可包含多個
它們之間以及與path組件之間用分好(;)隔開
query 一般在數據庫,索搜引擎等會用到。
沒有標準格式,一般用字符"?"將其同其他組件隔開
frag 一小片或者一部分資源的名稱,該組件不會傳給服務器,在客戶端內部使用
通過字符"#"將其與URL其他組件隔開

2.1 scheme

scheme用於規定如何訪問服務器資源,會告訴負責機械URL的應用程序使用什麼協議。由第一個":"符號將其餘URL其他組件分開(如http:表示用的HTTP協議),同時其是大小寫不敏感的,即:“http:”和“HTTP:”是等價的。

2.2 主機與端口

前面的scheme只是告訴服務器用什麼協議來訪問資源,但是要怎麼找到安裝有服務器的機器呢,就是通過主機,找到主機後,有可能一臺主機上面會有很多服務,我們需要找到指定的服務(應用程序),這個時候就需要指定該應用程序監聽的端口。所以最終通過主機和端口就能最終確定服務所在的位置了。
一般主機有兩種表示方式,一直是直接用IP(Internet Procotol)地址,一種使用域名錶示,結合端口表示如下:

方式 地址
IP地址 http://161.58.228.45:80/index.html
域名 http://www.example.com:80/index.html

假設上述的161.58.288.45的IP就是對域名www.example.com對應的IP的話,那兩者訪問的就是同一服務器上的同一資源。

2.3 用戶名和密碼

用戶名和密碼用“@”符號將它和其他URL組件分隔開來,但並不是所有的URL都會有用戶名和密碼,如:

2.4 路徑

URL中的路徑組件說明了資源存在於服務器的什麼位置。如:
http://www.joes-hardware.com:80/seasonal/index-fall.html
這個URL中的“/seasonal/index-fall.html”就是路徑。一般用“/”將路徑分爲各路徑段。

2.5 參數

參數是一個不太常見的URL組件,但是有部分服務器僅從路徑名和端口是不足以讓服務器提供所需資源,還需要一些參數。參數組件是由鍵值對組成,一般通過“;”字符和其他組件分隔開。如:
ftp://prep.ai.mit.edu/pub/gnu;type=d
該URL裏面就包含一個type=d的參數組件。

2.6 查詢字符串

很多資源,比如數據庫服務,都是可以通過提問題或進行查詢來縮小所請求資源類型範圍的。一般通過“?”字符同其他組件隔開,如:
http://www.joes-hardware.com/inventory-check.cgi?item=12731
裏面的item=12731就是一個查詢字符串。如果一個查詢字符串包含多個查詢參數,可以使用"&"隔開,如:
http://www.joes-hardware.com/inventory-check.cgi?item=12731&color=blue

2.7 片段

有些資源類型,比如 HTML,除了資源級之外,還可以做進一步的劃分。比如,對一個帶有章節的大型文本文檔來說,資源的 URL 會指向整個文本文檔,但理想的情況是,能夠指定資源中的那些章節。
爲了引用部分資源或資源的一個片段,URL 支持使用片段(frag)組件來表示一個資源內部的片段。比如,URL 可以指向 HTML 文檔中一個特定的圖片或小節。

3 URL快捷方式

這裏所說的“快捷方式”是指一些不完整的URL,如:相對URL,自動擴展等

3.1 相對URL

如果寫過前端HTML頁面的朋友對這個概念應該不會陌生。大部分HTML文檔內的跳轉鏈接都使用了相對URL。所謂的相對URL,就是相對於一個基礎URL(baseUrl)。如一個HTML文檔的資源URL是http://www.joes-hardware.com/tools.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 HREF="./hammers.html">hammers
</A> on earth.
</BODY>
</HTML>

這裏根據該文檔本身的資源URL,可以推斷出baseUrl爲http://www.joes-hardware.com/。這個文檔裏面的./hammers.html就是相對URL,一般瀏覽器解析的時候會自動加上baseURL組成完整的URLhttp://www.joes-hardware.com/hammers.html對其進行訪問。

3.2 自動擴展URL

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

  • 主機名擴展:如我們輸入baidu,一般瀏覽器就能自動擴展爲www.baidu.com
  • 歷史擴展:如果你之前訪問過http://www.joes-hardware.com,如果你再次在瀏覽器輸入joes,它就會自動擴展出完整的URL地址。

4 字符編碼

URL爲了達到可移植和安全傳輸的特性,所以URL只能使用一些較小的,相對安全的字母表中的字符。但是一些使用URL的人又希望用一些不在規定字母表中的字符,這個時候就需要對這些字符進行編碼轉義,然後再進行傳輸。

4.1 URL字符集

我想從事計算機相關行業的人對US-ASCII 字符集都不會陌生,而且由於其歷史悠久,所以可移植性也非常好,但是該字符集對英語語言非常友好,但是對於其他語言比如中文的支持非常不好。URL 的設計者就將轉義序列集成了進去。通過轉義序列,就可以用 US-ASCII 字符集的有限子集對任意字符值或數據進行編碼了,這樣就實現了可移植性和完整性。

4.2 編碼機制

爲了達到上述的目的,傳輸和使用一些非ASCII字符集的字符或者數據,就設計出了一種編碼機制,通過“轉義”的方式來表示那些不安全的的字符。其表示方法爲:**一個百分號(%),後面跟着兩個表示字符 ASCII 碼的 十六進制數。**比如:

字符 ASCII碼 示例URL
~ 126(0x7E) http://www.joes-hadware.com/~joe
空格 32(0x20) http://www.joes-hardware.com/more tools.html
% 37(0x25) http://www.joes-hardware.com/100%satisfaction.html

4.3 字符限制

在 URL 中,有幾個字符被保留起來,有着特殊的含義,或者一些其他用途的字符。這些字符一般對使用有限制,除了用在其本身保留使用的場合外,也需要在URL中對齊編碼。

字  符 保留/受限
% 保留作爲編碼字符的轉義標誌
/ 保留作爲路徑組件中分隔路徑段的定界符
. 保留在路徑組件中使用
保留在路徑組件中使用
# 保留作爲分段定界符使用
? 保留作爲查詢字符串定界符使用
; 保留作爲參數定界符使用
: 保留作爲方案、用戶/口令,以及主機/端口組件的定界符使用
$, + 保留
@ & = 在某些方案的上下文中有特殊的含義,保留
{ } | \ ^ ~ [ ] ’ 由於各種傳輸Agent代理,比如各種網關的不安全處理,使用受限
< > " 不安全;這些字符在URL範圍之外[…]
0x00-0x1F, 0x7F 受限,這些十六進制範圍內的字符都在US-ASCII字符集的不可打印區間內
>0x7F 受限,十六進制值在此範圍內的字符都不在US-ASCII字符集的7比特範圍內

5 Scheme

這裏列出一些常見的協議和簡要說明:

方  案 描  述
http 超文本傳輸協議方案,除了沒有用戶名和密碼之外,與通用的URL格式相符。如果省略了端口,就默認爲80。基本格式:
http://<host>:<port>/<path>?<query>#<frag>。示例:
http://www.joes-hardware.com/index.html
http://www.joes-hardware.com:80/index.html
https 方案https與方案http是一對。唯一的區別在於方案https使用了網景的SSL,SSL爲HTTP連接提供了端到端的加密機制。其語法與HTTP的語法相同,默認端口爲443。
基本格式:https://<host>:<port>/<path>?<query>#<frag>示例:
https://www.joes-hardware.com/secure.html
mailto Mailto URL指向的是E-mail地址。由於E-mail的行爲與其他方案都有所不同(它並不指向任何可以直接訪問的對象),所以mailto URL的格式與標準URL的格式也有所不同。因特網E-mail地址的語法記錄在RFC 822中。基本格式:
mailto:<RFC-822-addr-spec>示例:
mailto:[email protected]
ftp 文件傳輸協議URL可以用來從FTP服務器上下載或向其上載文件,並獲取FTP服務器上的目錄結構內容的列表。在Web和URL出現之前FTP就已經存在了。Web應用程序將FTP作爲一種數據訪問方案使用。URL語法遵循下列通用格式。基本格式:
ftp://<user>:<password>@<host>:<port>/<path>;<params>
rtsp,rtspu RTSP URL是可以通過實時流傳輸協議(Real Time Streaming Protocol)解析的音/視頻媒體資源的標識符。方案rtspu中的u表示它是使用UDP協議來獲取資源的。基本格式:
rtsp://<user>:<password>@<host>:<port>/<path>
rtspu://<user>:<password>@<host>:<port>/<path>
示例:
rtsp://www.joes-hardware.com:554/interview/cto_video
file 方案file表示一臺指定主機(通過本地磁盤、網絡文件系統或其他一些文件共享系統)上可直接訪問的文件。各字段都遵循通用格式。如果省略了主機名,就默認爲正在使用URL的本地主機。基本格式:
file://<host>/<path>示例:
file://OFFICE-FS/policies/casual-fridays.doc
news 根據RFC 1036的定義,方案news用來訪問一些特定的文章或新聞組。它有一個很獨特的性質:news URL自身包含的信息不足以對資源進行定位。news URL中缺乏到何處獲取資源的信息——沒有提供主機名或機器名稱。從用戶那裏獲取此類信息是解釋程序的工作。比如,在網景瀏覽器的“選項”(Options)菜單中,就可以指定自己的NNTP(news)服務器。這樣,瀏覽器有了news URL的時候就知道應該使用哪個服務器了。新聞資源可以從多臺服務器中獲得。它們被稱爲位置無關的,因爲對它們的訪問不依賴於任何一個源服務器。news URL中保留了字符“@”,用來區分指向新聞組的news URL和指向特定新聞文章的news URL。基本格式:
news:<newsgroup>
news:<news-article-id>示例:
news:rec.arts.startrek
telnet 方案telnet用於訪問交互式業務。它表示的並不是對象自身,而是可通過telnet協議訪問的交互式應用程序(資源)。基本格式:
telnet://<user>:<password>@<host>:<port>/示例:
telnet://slurp:[email protected]:23/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章