URL與資源
我又回來做筆記啦,書已經看了好幾章了,感覺確實學習了很多東西,弄明白了很多原來相對模糊的東西,不過感覺這本書確實理論性比較強,前幾章類似於HTTP的說明書吧,那么這么說的話,感覺之前做WEB開發時候連說明書都沒看就直接上了,這顯然是不行滴,不過感覺理論這種東西很容易忘,尤其是我這種非計算機專業的孩子理論知識上比起血統純正的計算機專業的學生還是有差距的,自學的孩子傷不起啊,實習回來,一面試發現原來的基礎知識都忘得差不多了,坑爹啊
廢話就說到這里,開始這次的筆記吧,這章主要說的是URL與資源的問題,根據我的理解呢,其實URL就是為了給互聯網上眾多的資源定位,以方便人們可以快速准確的找到資源,當然,與現實生活中一樣,這個所謂網絡上的地址也是有它自己獨特的規則的。
這里先簡單的說下URI,URL,URN之間的關系吧,其實上次筆記也說過,URN與URL都是URI的子集,URN是未來資源定位的理想型態,可以直接通過資源名(URN)尋找到所需要資源,而不用關心這個資源到底處於網絡上哪個位置。而URL是現在最通用的資源定位方式。
URL的基本結構:
URL基本有三個部分
- 第一部分:URL方案,也就是所謂的scheme,具體的來說也就是URL中的http等的東西,他告訴web客戶端怎么去訪問資源。
- 第二部分:服務位置,他告訴web客戶端資源在哪里。
第三部分:資源路徑,路徑說明的請求的是服務器上那個特定的本地資源。
URL可以通過HTTP之外的協議訪問資源,他們可以指向網上任意的資源,或者個人e-mail。
這里閑扯一段歷史(個人愛好(¯﹃¯)),在URL出現之前,人們是使用神馬來定位的呢,其實是FTP,需要進過種種繁雜的操作步驟人們才能找到自己想要的資源,看到現在這么方便的獲取資源,真的是技術改變生活啊。
URL的基本格式:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
下面介紹下每個部分:
方案(使用什么協議):
方案是規定如何訪問指定資源的主要標識符,他負責告訴解析URL的應用程序用什么協議
方案必須以一個字母符號開始,有第一個“:”將其與URL的其余部分分割開來,方案名是與大小寫無關的,因此http與HTTP都沒有區別。
主機與端口:
主機標識了網上能夠訪問資源的宿主機器,可以用主機名或者IP表示主機名,端口標志了服務器正在監聽的網絡端口,對下層使用了TCP協議的HTTP來說,默認端口為80.
用戶名與密碼:
很多服務器都需要用戶輸入用戶名與密碼才能訪問數據,FTP服務器就是這樣一個常見的例子:
ftp://littlewhite:white@ftp.test.edu/pub/gnu
這里ftp是協議名,littlewhite是用戶名,white是密碼,ftp.test.edu是主機名,后面的是路徑,他也遵守URL的基本格式。
路徑:
URL的路徑說明了資源位於服務器的什么地方,路徑通常很像一個服務器的文件系統路徑,比如:
/img/baidu_sylogo1.gif
路徑可以用字符“/”將HTTP URL的路徑組件分為一些路徑段,每個路徑段都可以有自己的參數。
參數:
為了想應用程序提供它們所需要的輸入參數,URL中有一個參數組件,這個組件就是URL中的名值對列表,由字符“;”將其與URL其他部分分割開來,它們為應用程序提供了訪問資源所需要的附加信息。比如:
http://www.baidu.com/test;type=d
這個例子中,有一個參數type=d,名字為type,值為d。
前面也說過,HTTP URL路徑可以分為若干個路徑段,每個都有自己的參數,比如:
http://www.baidu.com/test;type=d/test2;type=r
查詢字符串:
這個東西在我們平時的web開發中經常遇到,先上例子:
http://www.baidu.com/test?name=littlewhite
上面這個例子?的后面就是所謂的查詢字符串了,服務器可以解析這個查詢字符串,獲取他所帶的信息,加以利用。
片段:
這個東西我們平時比較少會遇到,它是做什么的呢?有些資源,如HTML頁面,在資源及之外還可以進行進一步的細分,比如我想瀏覽一個格式為HTML的頁面的一個特定位置,如果沒有片段的話我們可能需要先獲取整個HTML頁面,再進行定位,但是使用了片段的話,可以再發送URL時候就對HTML內部進行定位,比如:
http://www.baidu.com/test.html#drills
發送這個請求之后,服務器仍會處理整個對象,而不是對象的片段,也就是說服務器仍會返回完整的test.html頁面,但當客戶端能打開這個頁面的時候會自動跳到drills這個部分。也就是說片段這個東西其實是對客戶端用的。
URL相對路徑和絕對路徑:
這個部分建議參考這篇博文http://blog.csdn.net/jzdzhiyun/article/details/5282512 這里對於相對路徑和絕對路徑有比較詳細的介紹,當然這個博文說的是文件系統的,而URL的相對路徑與絕對路徑類似,但有幾點需要強調下:
- 相對路徑需要用基礎URL進行補完,有些時候有些資源會顯示的指定基礎URL,如在HTML頁面中指定<BASE>,通過它來轉換這個頁面的相對路徑。
- 如果沒有顯示的制定基礎URL的話,那么會以當前的頁面的位置作為基礎URL進行相對路徑補完。
解析相對URL流程圖:

下面來個例子:
解析相對路徑./test2.html (從頁面http://www.baidu.com/test1.html訪問)
- 路徑為./test2.html,基礎為http://www.baidu.com/test1.html
- 相對路徑方案為空,沿着圖標的左半邊向下處理,繼承基礎URL方案(HTTP)。
- 至少一個組件為非空,一直處理到低端,繼承主機和端口。
- 將來自相對URL的組件與我們繼承來的組件進行組合,得到http://www.baidu.com/test2.html
令人蛋疼的字符問題:
如上面所說的,URL是可以再各種協議中使用的,也就是說無論任何協議都可以准確安全的傳送到目的地,者流就有個問題了:有些協議會剝去一些特定的字符做專門的用途,可以參考類似於我們在編程中經常遇到的關鍵字符什么的,而URL既要保證所有協議傳輸時都不能出問題,又要保證URL對人類來說有可閱讀性,而且還有完整性,要求非常非常的多,這時轉義機制就華麗麗的誕生了~
URL使用的是US-ASCII,但是這個字符主要針對的是英文,隨着互聯網的發展,各種類別的語言都有了通過URL傳輸的需求,而且也有二進制傳輸的需求等等,為了避開安全字符集帶來的限制,人們設計了一種編碼機制,用來表示URL中各種不安全的字符,這種轉義方法包含了一個百分號(%),后面跟着兩個字符ASCII碼的十六進制數,下面舉個例子:
空格 ASCII碼:32(0x20) http://www.baidu.com/i%20love%20you 這個就等於不安全的 http://www.baidu.com/i love you 了
字符限制:
在URL中,有幾個字符是被保留起來的,有着特殊的含義,這個具體的可以在網上查到,就不一一列舉了。
各種方案:
這里列舉一些比較常見的方案:
- http 超文本傳輸協議方案,除了沒有用戶名和密碼外,與通用的URL格式相似,如果省略了端口的話,默認為80。
- https 這個與http是一對,唯一區別就是https方案使用了網景的SSL,SSL為HTTP連接提供了端到端的加密機制,語法與HTTP語法相同,默認端口為443.
關於URL的未來:
之前提到過URN這個東西,URN這個東西非常強大,因為如果你能使用URN那么你將不需要知道資源的具體位置在哪個服務器上,我們只需要輸入目標資源的URN,就可以在透明的情況下找到我們所需要的資源,這就想說我現在想要知道小明童鞋現在在世界的哪里,把它直接傳送到我面前,那么他就可以直接過來了。現在存在一種偽URN,就是將目標資源所謂的編碼交給使中間服務器進行查找,將查找到的資源的整合返回,感覺有點類似於搜索吧。。
這次的筆記就到這里了,下一章是長篇啊,工作量略大,加油。
