expires、cache-control、last-modified、etag是rfc 2616(http/1.1)協議中和網頁快取相關的幾個字段。前兩個用來控制快取的失效日期,後兩個用來驗證網頁的有效性。要注意的是,http/1.0有乙個功能比較弱的快取控制機制:pragma,使用http/1.0的快取將忽略expires和cache-control頭。我們這裡以apache2.0伺服器為例,只討論http/1.1協議。
expires
expires欄位宣告了乙個網頁或url位址不再被瀏覽器快取的時間,一旦超過了這個時間,瀏覽器都應該聯絡原始伺服器。rfc告訴我們:「由於推斷的失效時間也許會降低語義透明度,應該被謹慎使用,同時我們鼓勵原始伺服器盡可能提供確切的失效時間。」
對於一般的純靜態頁面,如html、gif、jpg、css、js,預設安裝的apache伺服器,不會在響應頭新增這個字段。firefox瀏覽器接受到相應後,如果發現沒有expires欄位,瀏覽器根據檔案的型別和「last-modified」欄位來推斷出乙個合適的失效時間,並儲存在客戶端。推測出的時間一般是接受到響應時間後的三天左右。
apache的expires_module模組可以在http響應頭部自動加上expires欄位。在apache的httpd.conf檔案中進行如下配置:
#啟用expires_module模組
loadmodule expires_module modules/mod_expires.so
# 啟用有效期控制
expiresactive on
# gif有效期為1個月
expiresbytype image/gif a2592000
# html文件的有效期是最後修改時刻後的一星期
expiresbytype text/html m604800
#以下的含義類似
expiresbytype text/css 「now plus 2 month」
expiresbytype text/js 「now plus 2 day」
expiresbytype image/jpeg 「access plus 2 month」
expiresbytype image/bmp 「access plus 2 month」
expiresbytype image/x-icon 「access plus 2 month」
expiresbytype image/png 「access plus 2 month」
對於動態頁面,如果在頁面內部沒有通過函式強制加上expires,例如header(」expires: 」 . gmdate(」d, d m y h:i:s」) . 」 gmt」),apache伺服器會把wed, 11 jan 1984 05:00:00 gmt
作為expires欄位內容,返回給瀏覽器。即認為動態頁面總是失效的。而瀏覽器仍然會儲存已經失效的動態頁面。
可以發現firefox瀏覽器總是快取所有頁面,不管失效、不失效還是沒有宣告失效時間。即使快取中宣告了乙個網頁的實效日期是1970-01-01 08:00:00,瀏覽器仍然會傳送該檔案在快取中的last-modified和etag欄位。 如果在伺服器端驗證通過,返回304狀態,瀏覽器就還會使用此快取。
cache-control
cache-control欄位中可以宣告多些元素,例如no-cache, must-revalidate, max-age=0等。這些元素用來指明頁面被快取最大時限,如何被快取的,如何被轉換到另乙個不同的媒介,以及如何被存放在持久媒介中的。但是任何乙個cache-control指令都不能保證私隱性或者資料的安全性。「private」和「no-store」指令可以為私隱性和安全性方面提供一些幫助,但是他們並不能用於替代身份驗證和加密。
apache的mod_cern_meta模組允許檔案級http響應頭部的控制,同時它也可以配置cache-control頭(或任何其他頭)。響應標頭檔案是放在原始目錄的子目錄中,根據源檔名所命名的乙個檔案。具體用法請參閱apache的官方**。
其中cache-control : max-age表示失效日期。如果沒有啟動mod_cern_meta模組,apache伺服器會把expires欄位中的日期換算成以秒為單位的乙個delta值,賦值給max-age。如果啟動mod_cern_meta模組,並且配置了max-age值,apache會將這個覆蓋expires欄位。同時,max-age隱含了canche-control: public。這樣瀏覽器接受到的cache-control : max-age和expires值就是一致的。
如果失效日期cache-control : max-ag=0或者是負值,瀏覽器會在對應的快取中把expires設定為1970-01-01 08:00:00。
last-modified
last-modified和etag是條件請求(conditional request)相關的兩個字段。如果乙個快取收到了針對乙個頁面的請求,它傳送乙個驗證請求詢問伺服器頁面是否已經更改,在http頭裡面帶上」etag」和」if modify since」頭。伺服器根據這些資訊判斷是否有更新資訊,如果沒有,就返回http 304(not modify);如果有更新,返回http 200和更新的頁面內容,並且攜帶新的」etag」和」last-modified」。
使用這個機制,能夠避免重**送檔案給瀏覽器,不過仍然會產生乙個http請求。
一般純靜態頁面本身都會有last-modified資訊,apache伺服器會讀取頁面檔案中的last-modified資訊,並新增到http響應頭部。
對於動態頁面,如果在頁面內部沒有通過函式強制加上last-modified,例如header(」last-modified: 」 . gmdate(」d, d m y h:i:s」) . 」 gmt」),apache伺服器會把當前時間作為last-modified,返回給瀏覽器。
無論是純靜態頁面還是動態頁面,firefox瀏覽器巧妙地按照接受到伺服器響應的時間設定快取頁面的last-modified,而不是按照http響應頭部中的last-modified欄位。
etag
既然有了last-modified,為什麼還要用etag欄位呢?因為如果在一秒鐘之內對乙個檔案進行兩次更改,last-modified就會不正確。因此,http/1.1利用entity tag頭提供了更加嚴格的驗證。
apache伺服器預設情況下,會對所有的靜態、動態檔案的響應頭新增etag欄位。
在apache的httpd.conf檔案中可以通過fileetag指令配置該選項。fileetag指令配置了當文件是基於乙個檔案時用以建立etag(entity tag)響應頭的檔案的屬性。在apache 1.3.22及以前,etag的值是對檔案的索引節(inode),大小(size)和最後修改時間(mtime)進行hash後得到的。 如果乙個目錄的配置包含了『fileetag inode mtime size』而其乙個子目錄包含了『fileetag -inode』那麼這個子目錄的設定(並會被其下任何沒有進行覆蓋的子目錄繼承)將等價於『fileetag mtime size』。
---★ 本文**自『it學習者』→
Web伺服器磁碟滿故障深入分析
問題 生產線伺服器磁碟滿了,該刪除的日誌都刪掉了,可空間還是滿的,硬碟顯示被寫滿,使用du sh 檢視時占用磁碟空間之和還遠小於磁碟大小,即找不到磁碟分割槽是怎麼滿的 即fdisk 和 du sh 之和不一樣 解答 出現原因 在apache tomcat 服務在執行狀態下,清空了執行服務的日誌,這裡...
new的深入分析
new 是c 的乙個關鍵字,同時也是操作符。關於new的話題非常多,因為它確實比較複雜,也非常神秘,下面我將把我了解到的與new有關的內容做乙個總結。new的過程 當我們使用關鍵字new在堆上動態建立乙個物件時,它實際上做了三件事 獲得一塊記憶體空間 呼叫建構函式 返回正確的指標。當然,如果我們建立...
伺服器快取
快取可以在客戶端和伺服器中做,要是之間還有 也可能對響應進行快取。是將客戶端和伺服器連線在一起,作為中間人角色,可以將客戶端請求響應的內容進行快取,在下次客戶端快取時,直接返回快取結果,提高效能。快取控制是在http頭資訊中cache control設定,當設成private時,不會進行快取,當設定...