Etag和Expires性能調(diào)優(yōu)的方法是什么

這篇文章主要介紹“Etag和Expires性能調(diào)優(yōu)的方法是什么”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Etag和Expires性能調(diào)優(yōu)的方法是什么”文章能幫助大家解決問題。

創(chuàng)新互聯(lián)建站主要從事網(wǎng)站制作、網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)高唐,10余年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108

1、Etag和Expires中Client 端Http Request Header及Server端Http Reponse Header工作原理。
2、靜態(tài)下Apache、Lighttpd和Nginx中Etag和Expires配置
3、非實時交互動態(tài)頁面中Etag和Expires處理
在客戶端通過瀏覽器發(fā)出第一次請求某一個URL時,根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會向服務(wù)器傳送報頭(Http Request Header),服務(wù)器端響應(yīng)同時記錄相關(guān)屬性標(biāo)記(Http Reponse Header),服務(wù)器端的返回狀態(tài)會是200,格式類似如下:
HTTP/1.1 200 OK
Date: Tue, 03 Mar 2009 04:58:40 GMT
Content-Type: image/jpeg
Content-Length: 83185
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
Cache-Control: max-age=2592000

Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: "5d8c72a5edda8d6a:3239″

客戶端第二次請求此URL時,根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會向服務(wù)器傳送報頭(Http Request Header),服務(wù)器端響應(yīng)并記錄相關(guān)記錄屬性標(biāo)記文件沒有發(fā)生改動,服務(wù)器端返回304,直接從緩存中讀?。?br/>HTTP/1.x 304 Not Modified
Date: Tue, 03 Mar 2009 05:03:56 GMT
Content-Type: image/jpeg
Content-Length: 83185
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
Cache-Control: max-age=2592000
Expires: Thu, 02 Apr 2009 05:14:08 GMT
Etag: "5d8c72a5edda8d6a:3239″
其中Last-Modified、Expires和Etag是標(biāo)記頁面緩存標(biāo)識

一、Last-Modified、Expires和Etag相關(guān)工作原理
1、Last-Modified
在瀏覽器第一次請求某一個URL時,服務(wù)器端的返回狀態(tài)會是200,內(nèi)容是你請求的資源,同時有一個Last-Modified的屬性標(biāo)記(Http Reponse Header)此文件在服務(wù)期端最后被修改的時間,格式類似這樣:
Last-Modified: Tue, 24 Feb 2009 08:01:04 GMT
客戶端第二次請求此URL時,根據(jù) HTTP 協(xié)議的規(guī)定,瀏覽器會向服務(wù)器傳送 If-Modified-Since 報頭(Http Request Header),詢問該時間之后文件是否有被修改過:
If-Modified-Since: Tue, 24 Feb 2009 08:01:04 GMT
如果服務(wù)器端的資源沒有變化,則自動返回 HTTP 304 (NotChanged.)狀態(tài)碼,內(nèi)容為空,這樣就節(jié)省了傳輸數(shù)據(jù)量。當(dāng)服務(wù)器端代碼發(fā)生改變或者重啟服務(wù)器時,則重新發(fā)出資源,返回和第一次請求時類似。從而保證不向客戶端重復(fù)發(fā)出資源,也保證當(dāng)服務(wù)器有變化時,客戶端能夠得到最新的資源。
注:如果If-Modified-Since的時間比服務(wù)器當(dāng)前時間(當(dāng)前的請求時間request_time)還晚,會認(rèn)為是個非法請求

2、Etag工作原理
HTTP 協(xié)議規(guī)格說明定義ETag為"被請求變量的實體標(biāo)記" (參見14.19)。簡單點即服務(wù)器響應(yīng)時給請求URL標(biāo)記,并在HTTP響應(yīng)頭中將其傳送到客戶端,類似服務(wù)器端返回的格式:
Etag: "5d8c72a5edda8d6a:3239″
客戶端的查詢更新格式是這樣的:
If-None-Match: "5d8c72a5edda8d6a:3239″
如果ETag沒改變,則返回狀態(tài)304。
即:在客戶端發(fā)出請求后,Http Reponse Header中包含 Etag: "5d8c72a5edda8d6a:3239″
標(biāo)識,等于告訴Client端,你拿到的這個的資源有表示ID:5d8c72a5edda8d6a:3239。當(dāng)下次需要發(fā)Request索要同一個URI的時候,瀏覽器同時發(fā)出一個If-None-Match報頭( Http RequestHeader)此時包頭中信息包含上次訪問得到的Etag: "5d8c72a5edda8d6a:3239″標(biāo)識。
If-None-Match: "5d8c72a5edda8d6a:3239"
,這樣,Client端等于Cache了兩份,服務(wù)器端就會比對2者的etag。如果If-None-Match為False,不返回200,返回304 (Not Modified) Response。

3、Expires
給出的日期/時間后,被響應(yīng)認(rèn)為是過時。如Expires: Thu, 02 Apr 2009 05:14:08 GMT
需和Last-Modified結(jié)合使用。用于控制請求文件的有效時間,當(dāng)請求數(shù)據(jù)在有效期內(nèi)時客戶端瀏覽器從緩存請求數(shù)據(jù)而不是服務(wù)器端. 當(dāng)緩存中數(shù)據(jù)失效或過期,才決定從服務(wù)器更新數(shù)據(jù)。

4、Last-Modified和Expires
Last-Modified標(biāo)識能夠節(jié)省一點帶寬,但是還是逃不掉發(fā)一個HTTP請求出去,而且要和Expires一起用。而Expires標(biāo)識卻使得瀏覽器干脆連HTTP請求都不用發(fā),比如當(dāng)用戶F5或者點擊Refresh按鈕的時候就算對于有Expires的URI,一樣也會發(fā)一個HTTP請求出去,所以,Last-Modified還是要用的,而 且要和Expires一起用。

5、Etag和Expires
如果服務(wù)器端同時設(shè)置了Etag和Expires時,Etag原理同樣,即與Last-Modified/Etag對應(yīng)的HttpRequest Header:If-Modified-Since和If-None-Match。我們可以看到這兩個Header的值和WebServer發(fā)出的Last-Modified,Etag值完全一樣;在完全匹配If-Modified-Since和If-None-Match即檢查完修改時間和Etag之后,服務(wù)器才能返回304.

6、Last-Modified和Etag
Last-Modified 和ETags請求的http報頭一起使用,服務(wù)器首先產(chǎn)生 Last-Modified/Etag標(biāo)記,服務(wù)器可在稍后使用它來判斷頁面是否已經(jīng)被修改,來決定文件是否繼續(xù)緩存
過程如下:
1. 客戶端請求一個頁面(A)。
2. 服務(wù)器返回頁面A,并在給A加上一個Last-Modified/ETag。
3. 客戶端展現(xiàn)該頁面,并將頁面連同Last-Modified/ETag一起緩存。
4. 客戶再次請求頁面A,并將上次請求時服務(wù)器返回的Last-Modified/ETag一起傳遞給服務(wù)器。
5. 服務(wù)器檢查該Last-Modified或ETag,并判斷出該頁面自上次客戶端請求之后還未被修改,直接返回響應(yīng)304和一個空的響應(yīng)體。
注:
1、Last-Modified和Etag頭都是由Web Server發(fā)出的Http Reponse Header,Web Server應(yīng)該同時支持這兩種頭。
2、Web Server發(fā)送完Last-Modified/Etag頭給客戶端后,客戶端會緩存這些頭;
3、客戶端再次發(fā)起相同頁面的請求時,將分別發(fā)送與Last-Modified/Etag對應(yīng)的Http RequestHeader:If-Modified-Since和If-None-Match。我們可以看到這兩個Header的值和WebServer發(fā)出的Last-Modified,Etag值完全一樣;
4、通過上述值到服務(wù)器端檢查,判斷文件是否繼續(xù)緩存;

二、Apache、Lighttpd和Nginx中針配置Etag和Expires,有效緩存純靜態(tài)如css/js/pic/頁面/流媒體等文件。
A、Expires
A.1、Apache Etag
使用Apache的mod_expires 模塊來設(shè)置,這包括控制應(yīng) Dd 時的Expires頭內(nèi)容和Cache-Control頭的max-age指令
ExpiresActive On
ExpiresByType image/gif "access plus 1 month"
ExpiresByType image/jpg "access plus 1 month"
ExpiresByType image/jpeg "access plus 1 month"
ExpiresByType image/x-icon "access plus 1 month"
ExpiresByType image/bmp "access plus 1 month"
ExpiresByType image/png "access plus 1 month"
ExpiresByType text/html "access plus 30 minutes"
ExpiresByType text/css  "access plus 30 minutes"
ExpiresByType text/txt  "access plus 30 minutes"
ExpiresByType text/js   "access plus 30 minutes"
ExpiresByType application/x-javascript   "access plus 30 minutes"
ExpiresByType application/x-shockwave-flash     "access plus 30 minutes"

<ifmodule mod_expires.c>
<filesmatch "\.(jpg|gif|png|css|js)$">
ExpiresActive on
ExpiresDefault "access plus 1 year"
</filesmatch>
</ifmodule>
當(dāng)設(shè)置了expires后,會自動輸出Cache-Control 的max-age 信息
具體關(guān)于 Expires 詳細(xì)內(nèi)容可以查看Apache官方文檔。
在這個時間段里,該文件的請求都將直接通過緩存服務(wù)器獲取,
當(dāng)然如果需要忽略瀏覽器的刷新請求(F5),緩存服務(wù)器squid還需要使用 refresh_pattern 選項來忽略該請求
refresh_pattern -i \.gif$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.jpg$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.jpeg$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.png$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.bmp$ 1440 100% 28800 ignore-reload
refresh_pattern -i \.htm$ 60 100% 100 ignore-reload
refresh_pattern -i \.html$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.xml$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.txt$ 1440 50% 28800 ignore-reload
refresh_pattern -i \.css$ 1440 50% 28800 reload-into-ims
refresh_pattern -i \.js$ 60 50% 100 reload-into-ims
refresh_pattern . 10 50% 60
有關(guān)Squid中Expires的說明,請參考Squid官方中refresh_pattern介紹。

A.2、Lighttpd Expires
和Apache一樣Lighttpd設(shè)置expire也要先查看是否支持了mod_expire模塊,
下面的設(shè)置是讓URI中所有images目錄下的文件1小時后過期;
expire.url = ( "/images/" => "access 1 hours" )
下面是讓作用于images目錄及其子目錄的文件;
$HTTP["url"] =~ "^/images/" {
expire.url = ( "" => "access 1 hours" )
}
也可以指定文件的類型;
$HTTP["url"] =~ "\.(jpg|gif|png|css|js)$" {
expire.url = ( "" => "access 1 hours" )
}
具體參考Lighttpd官方Expires解釋

A.3、Nginx中Expires
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 1h;
}
這類文件并不常修改,通過 expires 指令來控制其在瀏覽器的緩存,以減少不必要的請求。 expires 指令可以控制 HTTP 應(yīng)Dd Expires "和" Cache-Control "的頭標(biāo)(起到控制頁面緩存的作用)。其他請參考Nginx中Expires

B.1、Apache中Etag設(shè)置
在Apache中設(shè)置Etag的支持比較簡單,只用在含有靜態(tài)文件的目錄中建立一個文件.htaccess, 里面加入:
FileETag MTime Size
這樣就行了,詳細(xì)的可以參考Apache的FileEtag文檔頁

B.2、Lighttpd Etag
在Lighttpd中設(shè)置Etag支持:
etag.use-inode: 是否使用inode作為Etag
etag.use-mtime: 是否使用文件修改時間作為Etag
etag.use-size: 是否使用文件大小作為Etag
static-file.etags: 是否啟用Etag的功能
第四個參數(shù)肯定是要enable的, 前面三個就看實際的需要來選吧,推薦使用修改時間

B.3、 Nginx Etag
Nginx中默認(rèn)沒有添加對Etag標(biāo)識.Igor Sysoev的觀點"在對靜態(tài)文件處理上看不出如何Etag好于Last-Modified標(biāo)識。"
Note:
Yes, it's addition,and it's easy to add, however, I do not see howETag is better than Last-Modified for static files. -Igor Sysoev
A nice short description is here:
http://www.mnot.net/cache_docs/#WORK
It looks to me that it makes some caches out there to cache theresponse from the origin server more reliable as in rfc2616(ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt) is written.
3.11 Entity Tags 13.3.2 Entity Tag Cache Validators 14.19 ETag
當(dāng)然也有第三方nginx-static-etags 模塊了,請參考
http://mikewest.org/2008/11/generating-etags-for-static-content-using-nginx

三、對于非實時交互動態(tài)頁面中Epires和Etag處理
對數(shù)據(jù)更新并不頻繁、如tag分類歸檔等等,可以考慮對其cache。簡單點就是在非實時交互的動態(tài)程序中輸出expires和etag標(biāo)識,讓其緩存。但需要注意關(guān)閉session,防止http response時http header包含session id標(biāo)識;
3.1、Expires
如expires.php
<?php
header('Cache-Control: max-age=86400,must-revalidate');
header('Last-Modified: ' .gmdate('D, d M Y H:i:s') . ' GMT' );
header("Expires: " .gmdate ('D, d M Y H:i:s', time() + '86400′ ). ' GMT');
?>
以上信息表示該文件自請求后24小時后過期。
其他需要處理的動態(tài)頁面直接調(diào)用即可。
3.2、Etag
根據(jù)Http返回狀態(tài)來處理。當(dāng)返回304直接從緩存中讀取
如etag.php
<?php
cache();
echo date("Y-m-d H:i:s");
function cache()
{
$etag = "http://www.jb51.net";
if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
{
header('Etag:'.$etag,true,304);
exit;
}
else header('Etag:'.$etag);
}
?> 

我們知道合理配置etag能節(jié)省不少帶寬。 
事實上,配置etag緩存并沒有配置Last-Modified header 效果好。 
當(dāng)我們并不知道修改時間,Etag對動態(tài)內(nèi)容還是比較有用。 

關(guān)于etag補充: 
幾個不同或者需要補充的地方: 
1、“當(dāng)然,Etag 對多數(shù)站點性能的影響并不是很大。”應(yīng)該說 Etag 在正確使用的情況下,會讓大量的請求以 304 頭方式響應(yīng),可以相當(dāng)?shù)墓?jié)省服務(wù)器資源和帶寬。之前一些地方寫的不要使用 Etag,是基于有些 webserver 的 Etag 的計算方法中包含了 inode,這在多臺web服務(wù)器的情況不可采用的,而改變這個計算方法就可以了。 
2、對于盡早刷新這點,PHP 幾乎是做不到的。即使你執(zhí)行了 flush 以及類似的函數(shù),也要等到請求完全執(zhí)行之后,才會輸出給瀏覽器端。 
3、AJAX 使用 GET 和 POST 各有好處,GET 方式可以更快響應(yīng),但是可能會有被瀏覽器緩存的問題,一般都需要加個隨機數(shù)來避免,POST 方式則不會。所以最好是根據(jù)自己的情況分別使用 GET 和 POST 方法。

關(guān)于“Etag和Expires性能調(diào)優(yōu)的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。

網(wǎng)頁標(biāo)題:Etag和Expires性能調(diào)優(yōu)的方法是什么
網(wǎng)站網(wǎng)址:http://bm7419.com/article0/jdchio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)外貿(mào)建站、定制網(wǎng)站、軟件開發(fā)、做網(wǎng)站、企業(yè)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名