實在抱歉,因為本來這個系列應該早就應該寫完的,不過在我寫了兩章之後,沒有過多久,我的網站就崩潰了,崩潰的原因是有人試圖從我的網站抓取資料,從而造成了網站資料庫的頻繁訪問,如果大家看過我以前的幾篇,應該知道發生這樣的事情同樣會造成伺服器快取檔案過多,因為我使用的是虛擬機器主機,因此,伺服器就崩潰了。因此我覺得這個系統還存在缺陷,因此暫時沒有繼續介紹(當然到現在也沒有改善多少),之後就是春節,春節之後我就開始找工作,而且也一直沒有心情來寫這個,因此拖延了很久,到現在,我終於覺得不好意思了,決定不管是否完善,都將這個系統介紹完,就算拋磚引玉吧。
從我個人看來,網站的製作其實是一個很精細的事情,只是太精細之後,需要的開發成本就會提高,不過因為當前很多網站不需要如此精細的網站,所以很多技術沒有被重視,當硬體受到制約的時候(尤其是大的網站),這些技術就需要認真使用了,Cache和http狀態代碼就是這樣的例子,畢竟我覺得大多數的頁面是允許有一定的延遲的。
Cache就是瀏覽器的緩衝技術,大家肯定不陌生,瀏覽器在每次載入一個檔案的時候,都要去自己的快取檔案夾裡面去尋找是否存在可用緩衝,如果存在,則不再去伺服器下載而直接使用本地內容,這是一個很好的節省伺服器效能和流量的方式,在網站不做任何設定的情況下,瀏覽器會根據使用者的設定來確定是否使用緩衝,可見瀏覽器的“Internet選項”的“瀏覽曆史紀錄”的“設定”部分。
通常來講,Cache設定有兩種方式:第一種是在HTML內容的head之中設定:
<meta http-equiv="Expires" CONTENT="0"> //這一句設定檔案的到期時間為0秒
<meta http-equiv="Cache-Control" CONTENT="no-cache"> //這一句設定檔案禁止被緩衝
第二種是通過HTTP Head來設定,例如在.NET(C#)之中:
Response.Cache.SetExpires(time);//設定檔案的到期時間為當前的時間。
我個人比較喜歡通過HTTP HEAD這種方式來設定,因為我覺得這不屬於HTML本身的內容,當然,如果是靜態檔案,就只能通過html head來設定了,在我的網站"地名資訊系統"之中,我設定了每個HTML頁面在7天后失效,因為該HTML是自動產生的。
在上面的Cache介紹之中,提到了瀏覽器在存在緩衝的時候不去伺服器取相關的內容,可是僅僅這樣設定,好像有時候這些瀏覽器還是去伺服器請求,有些時候的請求很合理,例如使用者點擊[重新整理] 按鈕的時候,有些時候我也不知道為什麼,因此,我在系統之中進一步使用了HTTP狀態代碼。
HTTP狀態代碼有很多使用者不願意去瞭解,其實這是很重要的內容,至於怎麼個重要法,以及詳細的使用說明請大家去參考相關的文檔,我這裡舉幾個例子:
1.有的使用者在網站頁面不存在的時候顯示了自己定義的頁面,可是忘記使用404狀態代碼,這樣瀏覽器就不知道它下載的內容究竟是正常內容還是頁面不存在的提示,可能使用者能從頁面內容上分辨出來,可是搜尋引擎的機器人不會,因此就可能會被搜尋引擎列入“無法檢索”的黑名單。
2.在頁面轉向的時候不使用301或者302的狀態代碼,造成搜尋引擎不知道葉面已經被轉向。
我專門要說的304是一個用處和Cache相同的東西,這個狀態代碼的含義是“伺服器端沒有更新”,也就是說用戶端的檔案版本是最新的,他的用法是這樣的:
1.當使用者首次請求該檔案的時候,通過HTTP HEAD的Last-Modified欄位將該檔案的最後修改日期發送到用戶端,讓用戶端知道該檔案的版本,例如:
Last-Modified: Tue, 08 Apr 2008 14:48:05 GMT
2.在瀏覽器再次請求該檔案的時候,會自動將該時間作為請求的HTTP HEAD的If-Modified-Since欄位內容(有時候根據瀏覽器的不同,可能會用逗號隔開附加上檔案的位元組數大小),例如:
If-Modified-Since: Tue, 08 Apr 2008 14:48:05 GMT
3.服務端根據If-Modified-Since欄位的內容(如果存在該欄位)來判斷用戶端的檔案是否已經到期,如果已經到期,則重新返回新的檔案,如果沒有,則只需要返回304狀態代碼,就可結束輸出,這樣代表瀏覽器端的檔案版本是最新的,不需要返迴文件內容。
要知道,伺服器返回一個304的時間要比返回整個檔案的時間要小得多,效能損耗和網路佔用也小得多。
Cache和304技術有一定的重複,我選擇Cache和304技術一起使用是因為單用Cache好像瀏覽器有時候還是去取最新內容(尤其是使用者點擊重新整理按鈕的時候),而單獨使用304則在瀏覽器向伺服器詢問的過程還是會佔用一定的效能和時間。這兩種技術結合起來使用是剛剛好的。