URI 和 URL的一些研究筆記
作者:puterjam 日期:2011-11-15
1. 關鍵字回顧:
RFC(Request For Comments) ,RFC文檔是一系列關于Internet(早期為ARPANET)的技術資料匯總,于1969年開始發布。它制定了我們很多常見和不常見的Internet的各種文字資料和規范。
URI(Universal Resource Identifiers) 統一資源標識符, RFC 文獻1630中定義了它詳細的規范(1994年6月)
|- URL(Uniform Resource Locators) 統一資源定位符,RFC文獻1738中定義了它詳細的規范(1994年12月)
在URI的規范中,資源描述文字,只允許使用字母,數字,安全字符,特殊字符,和轉義字符
轉義字符在URL中規定是使用%和兩個hex進行表示,所以也就是為什么瀏覽器的form post會自動進行轉義成%xx的關系而不使用unicode常用的%uxxxx(同時ECMAScript v3也不推薦在js中使用escape)。
但是值得注意的是在URI中,空格是作為保留字的,所以URI規范中空格被輔以一個快速標記符號(short hand notation)來進行標識,就是我們看到的+號。所以在php中提供的urlencode方法是為了把字符串轉換成URI規范用的, 保留空格轉換成+號,可以模擬出瀏覽器form post的結果。
2. 說說 URL
URL 其實是 URI 中的一個子集,URI是一個很寬泛的定義,而且也在URI的基礎上做了自己的特殊規范,例如
另外 URL 中把 # 規定成錨點是用來定位使用,使用了URI規定的保留字中的一個字符。
當然URL的escape也遵循了URI的規范使用 %和兩個hex的格式。
值得注意的是URL的保留字和URI是不一樣的,這些字符都是有特殊意義的
有沒有注意到空格在里面?在URL規范中,空格只是認為不安全(unsafe)的存在,因為可能會因為排版和打印關系,可能會被忽略,所以URL中是需要把空格轉換成%20的。對應的php提供的rawurlencode 方法是用來把字符串轉換成URL的標準。
JS中的 encodeURI和encodeURIComponent 對字符的轉義,雖然也是按照URI規范轉義,但是它并沒還有轉換空格成+號,而是%20,后者會把URI的保留字; : / ?也進行轉義。為什么瀏覽器和流行的server遇到 “ “,%20,+ 都會轉換成空格?其實是為了更好兼容URI標準。
其實很多流行的http server都已經根據標準自動把url進行decode后給到后面的CGI進行處理,而我們自己的server很多時候需要開發來對這些進行decode。如果對這些標準不了解就很容易在decode的時候使用錯誤的decode手段。
而unicode目前使用場景最多的是在我們的腳本語言和頁面展示中,為了支持更寬的字符集,用一種統一的編碼來規范處理文字而使用,瀏覽器會根據資源的定義(charset) 對目標的文字先進行unicode轉義后再進行統一的處理,這樣就可以保證一個utf-8 的頁面也可以同時支持請求GB2312的資源,而不會因此顯示出錯。
3. 附件:
除了URI和URL以外,還有一個不太流行的URN(Uniform Resource Name), 有興趣的同學可以自己研究:P,它同樣也是屬于URI的子集。











