http中有關快取相關的幾個字段

2022-02-16 23:57:37 字數 4681 閱讀 9368

**自:

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(notmodify);如果有更新,返回http 200和更新的頁面內容,並且攜帶新的」etag」和」lastmodified」。

使用這個機制,能夠避免重**送檔案給瀏覽器,不過仍然會產生乙個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』。

apache服務的內容過期設定

上述配置檔案中load的兩個模組:mod_headers.so  和mod_expires.so 可以讓apache具有對header的一些定製功能。

expiresbytype:     表示按照檔案型別-mime-type設定過期策略;

a300: 表示在access後300秒後過期;

expiresbytype text/css a2592000:    表示mime type是text/css的檔案,在access後2592000秒過期。

expiresdefault a604800:  表示除了單獨制定的檔案型別等過期策略外的其他內容,按照這個預設的策略設定:訪問後604800秒過期。

上面的方法可以實現根據web發布的不同檔案型別,針對不同的發布目錄進行過期策略設定。在按照如上方法設定後,apache會自動的產生兩個相關的http header,舉例如下:

其中:date + max-age = expires.  max-age是個時間長度,對應web server上面設定的過期時間;expires是根據max-age算出來的過期時間點,兩者是一致的,不同cache在判斷內容是否過期時會嚴格比較系統時間和上述過期時間,或者比較age(在cache中存住的時間長度)和max-age的值。

幾個字串相關的題目

今天整理了幾個老師講過的字串的題目 1.求乙個字串中數字出現的個數和最大數 例如輸入ab12cd123ef1234 輸出結果 max 3,最大整數為1234 程式如下 include define max size 100 int main if count max str k 0 count 0 ...

「不簡單的」刪除幾個字元

需要知道最少需要刪除幾個字元是的有連續四個字元是 tongji 輸入描述 多組資料 每組資料報含乙個字串 1 n 100000 輸出描述 輸出乙個整數表示最少需要刪除的字元數,若不存在則輸出 1 示例1輸入 tongji ijgnot ttoonnggjjii輸出0 14 include inclu...

選中word文件裡的這幾個字

我想選擇下文中前面的古詩原文,但我不想複製後面的譯文。當我把滑鼠放上去,卻發現我若想選擇第一行,又想選擇第二行的開頭,那第一行不可避免的也成了你的選區 同樣,如果我想選中這四句詩,我也不得不選中前三行,可我只想選中每一行的前9個字啊。怎麼辦吶?難道我挨個把後面的譯文刪除掉嗎?不會,強大的word不會...