1. 程式人生 > >Http頭介紹:Expires,Cache-Control,Last-Modified,ETag

Http頭介紹:Expires,Cache-Control,Last-Modified,ETag

快取對於web開發有重要作用,尤其是大負荷web系統開發中。

快取分很多種:伺服器快取,第三方快取,瀏覽器快取等。其中瀏覽器快取是代價最小的,因為瀏覽器快取依賴的是客戶 端,而幾乎不耗費伺服器端的資源。

讓瀏覽器做快取需要給瀏覽器傳送指定的Http頭,告訴瀏覽器快取多長時間,或者堅決不要快取。

1.Expires(過期時間)HTTP頭資訊Expires(過期時間) 屬性是HTTP控制快取的基本手段,這個屬性告訴快取器:相關副本在多長時間內是新鮮的。過了這個時間,快取器就會向源伺服器傳送請求,檢查文件是否被修 改。幾乎所有的快取伺服器都支援Expires(過期時間)屬性;

大部分Web伺服器支援你用幾種方式設定Expires屬性;一般 的:可以設計一個絕對時間間隔:基於客戶最後檢視副本的時間(最後訪問時間)或者根據伺服器上文件最後被修改的時間;

Expires 頭資訊:對於設定靜態圖片檔案(例如導航欄和圖片按鈕)可快取特別有用;因為這些圖片修改很少,你可以給它們設定一個特別長的過期時間,這會使你的網站對 使用者變得相應非常快;他們對於控制有規律改變的網頁也很有用,例如:你每天早上6點更新新聞頁,你可以設定副本的過期時間也是這個時間,這樣快取 伺服器就知道什麼時候去取一個更新版本,而不必讓使用者去按瀏覽器的“重新整理”按鈕。

過期時間頭資訊屬性值只能是HTTP格式的日期時間,其他的都會被解析成當前時間“之前”,副本會過期,記住:HTTP的日期時間必須是格林威治時 間(GMT),而不是本地時間。舉例:
Expires: Fri, 30 Oct 1998 14:19:41

所以使用過期時間屬性一定要確認你的Web伺服器時間設定正確,一個途徑是通過網路時間同步協議(Network Time Protocol NTP),和你的系統管理員那裡你可以瞭解更多細節。

雖然過期時間屬性非常有用,但是它還是有些侷限,首先:是牽扯到了日期,這樣Web伺服器的時間和快取伺服器的時間必須是同步的,如果有些不同步, 要麼是應該快取的內容提前過期了,要麼是過期結果沒及時更新。

還有一個過期時間設定的問題也不容忽視:如果你設定的過期時間是一個固定的時間,如果你返回內容的時候又沒有連帶更新下次過期的時間,那麼之後所有 訪問請求都會被髮送給源Web伺服器,反而增加了負載和響應時間;

2.Cache-Control(快取控制) HTTP頭資訊

HTTP 1.1介紹了另外一組頭資訊屬性:Cache-Control響應頭資訊,讓網站的釋出者可以更全面的控制他們的內容,並定位過期時間的限制。
有 用的 Cache-Control響應頭資訊包括:

max-age=[秒] — 執行快取被認為是最新的最長時間。類似於過期時間,這個引數是基於請求時間的相對時間間隔,而不是絕對過期時間,[秒]是一個數字,單位是秒:從請求時間 開始到過期時間之間的秒數。
s-maxage=[秒] — 類似於max-age屬性,除了他應用於共享(如:代理伺服器)快取
public — 標記認證內容也可以被快取,一般來說: 經過HTTP認證才能訪問的內容,輸出是自動不可以快取的;
no-cache — 強制每次請求直接傳送給源伺服器,而不經過本地快取版本的校驗。這對於需要確認認證應用很有用(可以和public結合使用),或者嚴格要求使用最新資料 的應用(不惜犧牲使用快取的所有好處);
no-store — 強制快取在任何情況下都不要保留任何副本
must-revalidate — 告訴快取必須遵循所有你給予副本的新鮮度的,HTTP允許快取在某些特定情況下返回過期資料,指定了這個屬性,你快取記憶體,你希望嚴格的遵循你的規則。
proxy-revalidate — 和 must-revalidate類似,除了他只對快取代理伺服器起作用
舉例:
Cache-Control: max-age=3600, must-revalidate

給靜態資源(HTML檔案,圖片檔案等)的Repsone加上Expires/Cache-Control Header是很有效的一招。如果HTTP Response中有Expires這樣的Header的話,瀏覽器會Cache這個資源,理想狀況下(注意,只是理想狀況),在Expire Date之前,不會再發HTTP請求給Server要這個資源,不過Expires的值只能是一個固定日期,比如“Thu 27 Nov 2008 07:00:00 GMT”,不能是一個類似“從現在開始之後10年”這樣一個隨機浮動的值,如果要這樣的效果,可以用Cache-Control這樣的Header,如果 HTTP Response中有這樣的Header:“Cache-Control: max-age = 100”,表示這個資源在cache中的最大壽命是100秒。一般說來這種靜態檔案永遠不應該過期,如果真的要給這個Cache加上一個期限,那我希望是 ——一萬年,“Cache-Control: max-age = 315360000000”

其實就應該給Expires設一個永遠不會過期的時間,比如你現在有一個檔案叫logo.gif,需要用一個新的logo的時候,你不要去 覆蓋原來的檔案,而把新的logo存成logo_v2.gif,讓相關網頁引用新的logo_v2.gif,這樣可以讓新老網頁同時工作,實在犯不上為了 節省儲存空間覆蓋原有檔案。

對Apache伺服器,使用mod_expires,在httpd.conf或者.htaccess中加上

3.Last-Modified/If-Modified-Since

有些資料隨時都在變化。 CNN.com 的主頁經常幾分鐘就更新。另一方面,Google.com 的主頁幾個星期才更新一次 (當他們上傳特殊的假日 logo,或為一個新服務作廣告時)。 Web 服務是不變的:通常伺服器知道你所請求的資料的最後修改時間,並且 HTTP 為伺服器提供了一種將最近修改資料連同你請求的資料一同傳送的方法。

如果你第二次 (或第三次,或第四次) 請求相同的資料,你可以告訴伺服器你上一次獲得的最後修改日期:在你的請求中傳送一個 If-Modified-Since 頭資訊,它包含了上一次從伺服器連同資料所獲得的日期。如果資料從那時起沒有改變,伺服器將返回一個特殊的 HTTP 狀態程式碼 304,這意味著 “從上一次請求後這個資料沒有改變”。這一點有何進步呢?當伺服器傳送狀態編碼 304 時,不再重新發送資料。您僅僅獲得了這個狀態程式碼。所以當資料沒有更新時,你不需要一次又一次地下載相同的資料;伺服器假定你有本地的快取資料。

所有現代的瀏覽器都支援最近修改 (last-modified) 的資料檢查。如果你曾經訪問過某頁,一天後重新訪問相同的頁時發現它沒有變化,並奇怪第二次訪問時頁面載入得如此之快——這就是原因所在。你的瀏覽器首次 訪問時會在本地快取頁面內容,當你第二次訪問,瀏覽器自動傳送首次訪問時從伺服器獲得的最近修改日期。伺服器簡單地返回 304: Not Modified (沒有修改),因此瀏覽器就會知道從本地快取載入頁面。在這一點上,Web 服務也如此智慧。

4. ETag/If-None-Match

ETag 是實現與最近修改資料檢查同樣的功能的另一種方法:沒有變化時不重新下載資料。其工作方式是:伺服器傳送你所請求的資料的同時,傳送某種資料的 hash (在 ETag 頭資訊中給出)。hash 的確定完全取決於伺服器。當第二次請求相同的資料時,你需要在 If-None-Match: 頭資訊中包含 ETag hash,如果資料沒有改變,伺服器將返回 304 狀態程式碼。與最近修改資料檢查相同,伺服器僅僅 傳送 304 狀態程式碼;第二次將不為你傳送相同的資料。在第二次請求時,通過包含 ETag hash,你告訴伺服器:如果 hash 仍舊匹配就沒有必要重新發送相同的資料,因為你還有上一次訪問過的資料。

這幾個http頭可以作為meta標籤傳送到客戶端,但是需要注意的是Http頭中的設定優先順序更高一些,例如:
<meta. http-equiv=”Expires” CONTENT=” Fri, 30 Oct 1998 14:19:41″>
<meta. http-equiv=”Cache-Control” CONTENT=”no-cache”>

總結

Expires/Cache-Control Header是控制瀏覽器是否直接從瀏覽器快取取資料還是重新發請求到伺服器取資料。只是Cache-Control比Expires可以控制的多一些, 而且Cache-Control會重寫Expires的規則。

Last-Modified/If-Modified-Since和ETag/If-None-Match是瀏覽器傳送請求到伺服器後判斷檔案是否 已經修改過,如果沒有修改過就只發送一個304回給瀏覽器,告訴瀏覽器直接從自己本地的快取取資料;如果修改過那就整個資料重新發給瀏覽器。

相關推薦

Http介紹:Expires,Cache-Control,Last-Modified,ETag

快取對於web開發有重要作用,尤其是大負荷web系統開發中。 快取分很多種:伺服器快取,第三方快取,瀏覽器快取等。其中瀏覽器快取是代價最小的,因為瀏覽器快取依賴的是客戶 端,而幾乎不耗費伺服器端的資源。 讓瀏覽器做快取需要給瀏覽器傳送指定的Http頭,告訴瀏覽器快取多

Expires,Cache-Control,Last-Modified,ETag

Expires、Cache-Control、Last-Modified、ETag都是在http response的返回header中 用來控制瀏覽器客戶端快取行為的。 1.Expires在HTTP/1.0中已經定義,Cache-Control:max-age=xxx在HTT

http expires cache-control last-modified if-modified-since

關於 Cache-Control: max-age=秒 和 Expires Expires = 時間,HTTP 1.0 版本,快取的載止時間,允許客戶端在這個時間之前不去檢查(發請求) max-age = 秒,HTTP 1.1版本,資源在本地快取多少秒。 如果max-age

【轉載】瀏覽器緩存詳解:expires cache-control last-modified

導致 lang -c csdn 判斷 屬性 lan -m load 最近在對CDN進行優化,對瀏覽器緩存深入研究了一下,記錄一下,方便後來者 畫了一個草圖: 每個狀態的詳細說明如下: 1、Last-Modified 在瀏覽器第一次請求某一個URL時,服務器端的返回

【轉】Expires / Cache-Control / Last-Modified / If-Modified-Since / ETag / If-None-

本文主要講解web快取的應用. Expires / Cache-Control / Last-Modified / If-Modified-Since / ETag / If-None-Match 的區別以及使用詳解 為了演示體現快取的作用,先刪除所有的瀏覽器快取,然後以如下四種方式訪問baidu網站,

Meta http-equiv屬性與HTTPExpires中(Cache-control)詳解

一、概述 A、http-equiv顧名思義,相當於http的檔案頭作用,它可以向瀏覽器傳回一些有用的資訊,以幫助正確和精確地顯示網頁內容,與之對應的屬性值為content,content中的內容其實就是各個引數的變數值。 B、Cache-control用於控制HTTP快取

HTTPExpiresCache-control

1.概念 Cache-control用於控制HTTP快取(在HTTP/1.0中可能部分沒實現,僅僅實現了Pragma: no-cache) 資料包中的格式: Cache-Control: cache-directive cache-directive可以為以下: request時用到: | "no-cach

HTTP訊息中的“Cache-control”控制網頁的快取

網頁的快取是由HTTP訊息頭中的“Cache-control”來控制的,常見的取值有private、no- cache、max-age、must-revalidate等,預設為private。其作用根據不同的重新瀏覽方式分為以下幾種情況: (1) 開啟新視窗 值為pri

SQL註入(HTTP介紹

unix 連接 代理服務器 connect 詳解 mysql 等待 .com max-age HTTP 頭部詳解(轉自網絡)1、 Accept:告訴 WEB 服務器自己接受什麽介質類型,*/* 表示任何類型,type/* 表示該類型下的所有子類型,type/sub-type

005-優化web請求一-gzip壓縮、http緩存控制和緩存校驗[Pragma、ExpiresCache-Control、max-age、Last-Modified、用戶刷新訪問、避免過度304]

無法 新鮮度 開發者模式 請求報文 XML 自定義 server clas 存在   優化Web應用的典型技術:緩存控制頭信息、Gzip、應用緩存、ETag、反應型技術【異步方法調用和WebSocket】 一、模板緩存 spring.thymeleaf.cache=

瀏覽器快取及應用Cache-Control(用於本地快取),Expires(用於本地快取),Last-Modified(協商快取),Etag(協商快取)

1.與瀏覽器快取相關的http headers Cache-Control(用於本地快取),Expires(用於本地快取),Last-Modified(協商快取),Etag(協商快取) Cache-Control:指定請求和響應遵循的快取機制。在請求訊息或響應訊息中設定Cache-Control並不會修改另

<meta>標簽http-equiv屬性中pragma cache-control expires三者的關系。

lan pro ont style rfc toc color control header 1 <meta http-equiv="pragma" content="no-cache"> 2 <meta http-equiv="cache-contro

寫給後端程序員的HTTP緩存原理介紹--怎樣決定一個資源的Cache-Control策略呢

服務 tle 當下 程序員 max-age pri bad ref 網絡 通過Internet獲取資源既緩慢,成本又高。為此,Http協議裏包含了控制緩存的部分,以使Http客戶端可以緩存和重用以前獲 取的資源,從而優化性能,提升體驗。雖然Http中關於緩存控制的部分,隨著

HTTP 協議中快取處理機制(ExpiresLast-ModifiedETag

應用場景 瞭解 HTTP(我們這裡說的是 HTTP/1.1) 協議中快取的處理機制,會對網站優化有些許幫助,例如會應用到:加速網站的載入,伺服器端與瀏覽器檔案及時同步。 瀏覽器請求 URL 時,根據 HTTP 協議的規定,瀏覽器與伺服器會通過報頭(HTTP Request Header、HTTP Repon

設定http響應Cache-Control及Pragma,增加CDN cache命中率

最近在折騰CDN cache命中率。然後就發現在偽靜態環境下,cdn快取命中率非常低,一番折騰後發現如果源站的http頭部包含一些不快取的資訊,那麼CDN”也許“會相應的繼承源站發出的HTTP狀態。通常喜歡用軍哥LNMP安裝包的朋友會發現,在動態及偽靜態的環境中,HTTP

愛創課堂每日一題第二十三天- ExpiresCache-Control

前端 前端學習 前端入門Expires要求客戶端和服務端的時鐘嚴格同步。HTTP1.1引入Cache-Control來克服Expires頭的限制。如果max-age和Expires同時出現,則max-age有更高的優先級。 Cache-Control: no-cache, private, max

瀏覽器緩存之Expires Etag Last-Modified max-age詳解

tag 新的 本地緩存 關系 發現 發生 按鈕 緩存 ida  前段時間去面試移動端的H5開發工程師,在最後面試的時候被問到了max-age Expires Etag有什麽不同,在什麽情況下應用,當時亂編了一通,自我感覺良好,結果…… 大家懂得,現在講他們幾個的區別以及如何

header設定解決 “已攔截跨源請求:同源策略禁止讀取位於 http://47.104.128.87/back/test/test 的遠端資源。(原因:CORS 缺少 'Access-Control-Allow-Origin')。”

跨域請求錯誤提示如下圖: 解決方法在請求的php頁面新增header頭: 程式碼如下: public function test() { //支援全域名訪問,不安全,部署後需要固定限制為客戶端網址 header('Access-Control-Allow-Origin:*'

快取Cache-Control的含義和使用

Cache-Control 的含義 可快取性 public,http 請求返回的過程當中,在 cache-control 中設定這個值,代表 http 請求返回的內容所經過的任何路徑當中(包括中間一些http代理伺服器以及發出請求的客戶端瀏覽器),都可以對返回內

淺談http中的Cache-Control

前言 我們用http訪問時,會先發送一個請求,之後伺服器返回一個應答,在Chrome的偵錯程式(按F12或右擊選擇檢查)中展現了整個過程: 第一部分General是概要,包含請求地址,請求方式,狀態碼,伺服器地址以及Referrer 策略。 第二部分是應答頭部