HTTP URL 詳解

概述

URL 提供了一種定位因特網上任意資源的手段,大多數 URL 語法都由以下九個結構的通用格式組成:

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

  • 方案:訪問服務器以獲取資源時要使用哪種協議
  • 用戶:某些方案訪問資源時需要的用戶名
  • 密碼:用戶名後面可能要包含的密碼,中間由冒號分隔
  • 主機:資源宿主服務器的主機名或 IP 地址
  • 端口:資源宿主服務器正在監聽的踹口號,很多方案都有默認端口號(HTTP 的默認端口號爲 80)
  • 路徑:服務器上資源的本地名,由一個斜槓(/)將其與前面的 URL 組件分隔開來
  • 參數:指定輸入參數,參數爲鍵值對,URL 中可以包含多個參數,使用分號分隔
  • 查詢:同樣用來指定輸入參數,參數爲鍵值對,URL 中可以包含多個參數,使用 & 分隔
  • 片段:一小片或一部分資源的名字,引用對象時,不會將 frag 字段傳送給服務器,這個字段是在客戶端內部使用的

方案

方案規定如何訪問指定資源的資源標識符,常用的方案有:

  • HTTP:文本傳輸協議,除了傳遞普通文本,還可以傳遞文件流或者進制編碼等信息,是目前最常用的 web 傳輸
  • HTTPS:基於 SSL 加密的 HTTP 傳輸協議,比 HTTP 更加的安全
  • FTP:文件傳輸協議,一般用來實現資源文件在服務器上的上傳下載

用戶名和密碼

有些服務器都要求輸入用戶名和密碼纔會允許用戶訪問數據,FTP 服務器就是一個常見的例子:

ftp://ftp.prep.ai.mit.edulpub/gnu

第一個例子沒有用戶或密碼組件,只有標準的方案、主機和路徑,這時瀏覽器通常會插入一個默認的用戶名和密碼,用戶名一般是 anonymous(匿名用戶),密碼則根據瀏覽器而異

ftp://joe:[email protected]/gnu

第二個例子指定了用戶名(joe)和密碼(joespasswd)


主機與端口號

主機組件標識了因特網上能夠訪問資源的宿主機器,可以用主機名(www.joes-hardware.com)或者 IP 地址來表示。端口組件標識了服務器正在監聽的網絡端口,對下層使用了 TCP 協議的 HTTP 來說,默認端口號爲 80


路徑

路徑組件說明資源位於服務器的什麼地方,路徑通常很像一個分級的文件系統路徑,比如:http://www.joes-hardware.com:80/seasonal/index-fall.html


參數

對很多方案來說,只有簡單的主機名和路徑是不夠的,除了服務器正在監聽的端口,以及是否能夠通過用戶名和密碼訪問資源外,很多協議都還需要更多的信息才能工作

爲了嚮應用程序提供它們所需的輸入參數,以便正確地與服務器進行交互,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


查詢

很多資源,比如數據庫服務,都可以限定查詢條件來縮小所請求資源的範圍。比如,數據庫維護着一張貨物表,我們希望找到編號 12731 的貨物,就可以使用如下 URL 來查詢

http://www.joes-hardware.com/inventory-check?id=12731

多個參數之間可以用 & 分隔

http://www.joes-hardware.com/inventory-check?id=12731&color=blue


片段

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

爲了引用資源的一個片段,URL 支持使用片段(frag)組件來表示資源的一個片段。比如,URL 可以指向 HTML 文檔中一個特定的圖片或小節。

片段掛在 URL 的右手邊,最前面有一個字符 #。比如:http://www.joes-hardware.com/tools.html#drills

在這個例子中,片段 drills 引用了頁面/tools.html 中的一個部分,這部分的名字叫做 drills

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


URL 編碼

一般來說,URL 只能使用英文字母、阿拉伯數字和某些標點符號。如果 URL 帶有中文或者特殊字符時,就需要對 URL 進行編碼,使用安全字符去表示那些不安全的字符

URL 只允許使用 ASCII 字符集可以顯示的字符,比如英文字母、數字、和 - _ . ~ ! * 這六個特殊字符。當在 URL 中使用不屬於 ASCII 字符集的字符,如中文,空格,就要使用特殊的符號對該字符進行編碼,比如空格需要用 %20 來表示

另外,還需要對 URL 中的部分保留字符和不安全字符進行編碼,因爲這些字符有可能產生歧義,造成服務器解析錯誤,比如 URL 查詢參數中包含了 & 或者 %

保留字符:? = & / . ... # @ $ + ; %

部分不安全字符:[ ] < > " " { } | \ ^ * · ‘ ’

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章