亚洲免费成人网,99久久er这里只有精品17,欧美一级毛片兔费播放,亚洲国产精品久久日

  • 歡迎使用超級(jí)蜘蛛查,網(wǎng)站外鏈優(yōu)化,收藏快捷鍵 CTRL + D

性能优化,浅谈http中的Cache-Control


Cache-Control 是最重要的規(guī)則。這個(gè)字段用于指定所有緩存機(jī)制在整個(gè)請(qǐng)求/響應(yīng)鏈中必須服從的指令。這些指令指定用于阻止緩存對(duì)請(qǐng)求或響應(yīng)造成不利干擾的行為。這些指令通常覆蓋默認(rèn)緩存算法。緩存指令是單向的,即請(qǐng)求中存在一個(gè)指令并不意味著響應(yīng)中將存在同一個(gè)指令。

HTTP1.1引入了Cathe-Control,它使用max-age指定組件被緩存多久,從請(qǐng)求開始在max-age時(shí)間內(nèi)瀏覽器使用緩存,之外的使用請(qǐng)求,這樣就可以消除Expires的限制,

如果對(duì)瀏覽器兼容性要求很高的話,可以兩個(gè)都使用。

這里對(duì)http 304 狀態(tài)結(jié)合max-age做一個(gè)總結(jié):

瀏覽器初次訪問服務(wù)器---------------服務(wù)器返回200狀態(tài)

如下圖:

性能優(yōu)化,淺談http中的Cache-Control

瀏覽器再次請(qǐng)求服務(wù)器時(shí),瀏覽器會(huì)先判斷max-age,如果到期則直接請(qǐng)求服務(wù)器,否則直接從緩存中取,

服務(wù)器收到請(qǐng)求后,判斷文件是否被修改過,若是則直接返回200,否則返回304,瀏覽器將從緩存中獲取文件。

 

性能優(yōu)化,淺談http中的Cache-Control


若同步刷新頁面,則瀏覽器并不會(huì)先判斷max-age,而是直接發(fā)送請(qǐng)求,服務(wù)器接收到請(qǐng)求后,判斷文件是否有變化,若有則返回200,若沒有則返回304

我們用http訪問時(shí),會(huì)先發(fā)送一個(gè)請(qǐng)求,之后服務(wù)器返回一個(gè)應(yīng)答,在Chrome的開發(fā)者工具(按F12或右擊選擇檢查)中展現(xiàn)了整個(gè)過程:

性能優(yōu)化,淺談http中的Cache-Control

第一部分General是概要,包含請(qǐng)求地址,請(qǐng)求方式,狀態(tài)碼,服務(wù)器地址以及Referrer 策略。

第二部分是應(yīng)答頭部,是服務(wù)器返回的。

第三部分是請(qǐng)求頭部,是客戶端發(fā)送的。

這次我們從兩個(gè)角度來看看http的緩存:緩存控制和緩存校驗(yàn)。

緩存控制:控制緩存的開關(guān),用于標(biāo)識(shí)請(qǐng)求或訪問中是否開啟了緩存,使用了哪種緩存方式。

緩存校驗(yàn):如何校驗(yàn)緩存,比如怎么定義緩存的有效期,怎么確保緩存是最新的。

緩存控制

在http中,控制緩存開關(guān)的字段有兩個(gè):Pragma 和 Cache-Control。

Pragma

Pragma有兩個(gè)字段Pragma和Expires。Pragma的值為no-cache時(shí),表示禁用緩存,Expires的值是一個(gè)GMT時(shí)間,表示該緩存的有效時(shí)間。

Pragma是舊產(chǎn)物,已經(jīng)逐步拋棄,有些網(wǎng)站為了向下兼容還保留了這兩個(gè)字段。如果一個(gè)報(bào)文中同時(shí)出現(xiàn)Pragma和Cache-Control時(shí),以Pragma為準(zhǔn)。同時(shí)出現(xiàn)Cache-Control和Expires時(shí),以Cache-Control為準(zhǔn)。即優(yōu)先級(jí)從高到低是 Pragma -> Cache-Control -> Expires

Cache-Control

符合緩存策略時(shí),服務(wù)器不會(huì)發(fā)送新的資源,但不是說客戶端和服務(wù)器就沒有會(huì)話了,客戶端還是會(huì)發(fā)請(qǐng)求到服務(wù)器的。

Cache-Control除了在響應(yīng)中使用,在請(qǐng)求中也可以使用。我們用開發(fā)者工具來模擬下請(qǐng)求時(shí)帶上Cache-Control:勾選Disable cache,刷新頁面,可以看到Request Headers中有個(gè)字段Cache-Control: no-cache。

同時(shí)在Response Headers中也能到Cache-Control字段,它的值是must-revalidate,這是服務(wù)端設(shè)置的。

Cache-Control字段

在請(qǐng)求中使用Cache-Control 時(shí),它可選的值有:

性能優(yōu)化,淺談http中的Cache-Control

在響應(yīng)中使用Cache-Control 時(shí),它可選的值有:

性能優(yōu)化,淺談http中的Cache-Control

no-store優(yōu)先級(jí)最高

在Cache-Control 中,這些值可以自由組合,多個(gè)值如果沖突時(shí),也是有優(yōu)先級(jí)的,而no-store優(yōu)先級(jí)最高。我們可以測試下:在nginx中做如下配置:

server {
    listen 88;
    root /opt/ms;
    index index.php index.html index.htm index.nginx-debian.html;   
    location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {
        add_header Cache-Control no-store;
        add_header Cache-Control max-age=3600;
        add_header Cache-Control public;
        add_header Cache-Control only-if-cached;
        add_header Cache-Control no-cache;
        add_header Cache-Control must-revalidate;
    }
}

在/opt/ms下增加個(gè)文件type.css,內(nèi)容如下:

a{
    color: #000000;
}
a:focus,a:hover {
    text-decoration: none;
    color: #708090;
}

配置好之后,reload下nginx,在瀏覽器訪問地址http://127.0.0.1:88/type.css,可以看到響應(yīng)頭部包含nginx配置中的字段:

性能優(yōu)化,淺談http中的Cache-Control

重復(fù)刷新訪問,會(huì)發(fā)現(xiàn)每次的狀態(tài)碼都是200,原因是no-store的優(yōu)先級(jí)最高,本地不保存,每次都需要服務(wù)器發(fā)送資源。

public和private的選擇

如果你用了CDN,你需要關(guān)注下這個(gè)值。CDN廠商一般會(huì)要求cache-control的值為public,提升緩存命中率。如果你的緩存命中率很低,而訪問量很大的話,可以看下是不是設(shè)置了private,no-cache這類的值。如果定義了max-age,可以不用再定義public,它們的意義是一樣的。

哪里設(shè)置Cache-Control

以LNMP的環(huán)境為例,一次響應(yīng)經(jīng)歷的過程是:php-cgi解析代碼并執(zhí)行,將結(jié)果返回給nginx,如果nginx前面有反向代理,則會(huì)經(jīng)過一次反向代理服務(wù)器,所以cache-control可能會(huì)在nginx,php-cgi,php代碼,反向代理服務(wù)器這些地方地方設(shè)置。在php.ini中,有個(gè)參數(shù)是session.cache_limiter,需要注意下。在nginx中有個(gè)很常見的配置:

location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ { 
     expires  30d;
}

這個(gè)指令等同于cache-control: max-age=2592000,同時(shí)你會(huì)在響應(yīng)頭部看到一個(gè)etag字段,這是由于nginx默認(rèn)開啟,如果要關(guān)閉可以增加個(gè)配置etag off。這個(gè)etag就是我們接下要看的緩存校驗(yàn)字段。

緩存校驗(yàn)

在緩存中,我們需要一個(gè)機(jī)制來驗(yàn)證緩存是否有效。比如服務(wù)器的資源更新了,客戶端需要及時(shí)刷新緩存;又或者客戶端的資源過了有效期,但服務(wù)器上的資源還是舊的,此時(shí)并不需要重新發(fā)送。緩存校驗(yàn)就是用來解決這些問題的,在http 1.1 中,我們主要關(guān)注下Last-Modified 和 etag 這兩個(gè)字段。

Last-Modified

服務(wù)端在返回資源時(shí),會(huì)將該資源的最后更改時(shí)間通過Last-Modified字段返回給客戶端。客戶端下次請(qǐng)求時(shí)通過If-Modified-Since或者If-Unmodified-Since帶上Last-Modified,服務(wù)端檢查該時(shí)間是否與服務(wù)器的最后修改時(shí)間一致:如果一致,則返回304狀態(tài)碼,不返回資源;如果不一致則返回200和修改后的資源,并帶上新的時(shí)間。

性能優(yōu)化,淺談http中的Cache-Control


If-Modified-Since和If-Unmodified-Since的區(qū)別是:

If-Modified-Since:告訴服務(wù)器如果時(shí)間一致,返回狀態(tài)碼304

If-Unmodified-Since:告訴服務(wù)器如果時(shí)間不一致,返回狀態(tài)碼412

etag

單純的以修改時(shí)間來判斷還是有缺陷,比如文件的最后修改時(shí)間變了,但內(nèi)容沒變。對(duì)于這樣的情況,我們可以使用etag來處理。

etag的方式是這樣:服務(wù)器通過某個(gè)算法對(duì)資源進(jìn)行計(jì)算,取得一串值(類似于文件的md5值),之后將該值通過etag返回給客戶端,客戶端下次請(qǐng)求時(shí)通過If-None-Match或If-Match帶上該值,服務(wù)器對(duì)該值進(jìn)行對(duì)比校驗(yàn):如果一致則不要返回資源。

If-None-Match和If-Match的區(qū)別是:

If-None-Match:告訴服務(wù)器如果一致,返回狀態(tài)碼304,不一致則返回資源

If-Match:告訴服務(wù)器如果不一致,返回狀態(tài)碼412

總結(jié)

緩存開關(guān)是: pragma, cache-control。

緩存校驗(yàn)有:Expires,Last-Modified,etag。

從狀態(tài)碼的角度來看,它們的關(guān)系如下圖:

性能優(yōu)化,淺談http中的Cache-Control

cache-control的各個(gè)值關(guān)系如下圖

性能優(yōu)化,淺談http中的Cache-Control

本文鏈接:http://www.sztqnet.com/article/614.html

超級(jí)蜘蛛工具

  • 網(wǎng)站鏈接HTTP狀態(tài)批量檢測_在線批量檢測網(wǎng)站鏈接狀態(tài)_超級(jí)蜘蛛查
  • 百度關(guān)鍵詞排名查詢_網(wǎng)站關(guān)鍵詞排名批量查詢_超級(jí)蜘蛛查
  • 百度收錄查詢_在線百度收錄批量查詢_超級(jí)蜘蛛查
  • 域名IP地址批量查詢_在線批量查詢網(wǎng)站IP地址_超級(jí)蜘蛛查
  • 超級(jí)外鏈發(fā)布工具_(dá)在線免費(fèi)批量發(fā)布SEO外鏈_超級(jí)蜘蛛查
  • 網(wǎng)頁蜘蛛模擬抓取測試工具_(dá)超級(jí)蜘蛛工具_(dá)超級(jí)蜘蛛查