1. <nobr id="easjo"><address id="easjo"></address></nobr>

      <track id="easjo"><source id="easjo"></source></track>
      1. 
        

      2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
      3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>
          貴州做網站公司
          貴州做網站公司~專業!靠譜!
          10年網站模板開發經驗,熟悉國內外開源網站程序,包括DEDECMS,WordPress,ZBlog,Discuz! 等網站程序,可為您提供網站建設,網站克隆,仿站,網頁設計,網站制作,網站推廣優化等服務。我們專注高端營銷型網站,企業官網,集團官網,自適應網站,手機網站,網絡營銷,網站優化,網站服務器環境搭建以及托管運維等。為客戶提供一站式網站解決方案?。?!

          性能優化,淺談http中的Cache-Control

          來源:互聯網轉載 時間:2024-10-12 14:57:56

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

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

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

          這里對http 304 狀態結合max-age做一個總結:

          瀏覽器初次訪問服務器---------------服務器返回200狀態

          如下圖:

          瀏覽器再次請求服務器時,瀏覽器會先判斷max-age,如果到期則直接請求服務器,否則直接從緩存中取,

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

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

          我們用http訪問時,會先發送一個請求,之后服務器返回一個應答,在Chrome的開發者工具(按F12或右擊選擇檢查)中展現了整個過程:

          靠前部分General是概要,包含請求地址,請求方式,狀態碼,服務器地址以及Referrer 策略。

          第二部分是應答頭部,是服務器返回的。

          第三部分是請求頭部,是客戶端發送的。

          這次我們從兩個角度來看看http的緩存:緩存控制和緩存校驗。

          緩存控制:控制緩存的開關,用于標識請求或訪問中是否開啟了緩存,使用了哪種緩存方式。

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

          緩存控制

          在http中,控制緩存開關的字段有兩個:Pragma 和 Cache-Control。

          Pragma

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

          Pragma是舊產物,已經逐步拋棄,有些網站為了向下兼容還保留了這兩個字段。如果一個報文中同時出現Pragma和Cache-Control時,以Pragma為準。同時出現Cache-Control和Expires時,以Cache-Control為準。即優先級從高到低是 Pragma -> Cache-Control -> Expires

          Cache-Control

          符合緩存策略時,服務器不會發送新的資源,但不是說客戶端和服務器就沒有會話了,客戶端還是會發請求到服務器的。

          Cache-Control除了在響應中使用,在請求中也可以使用。我們用開發者工具來模擬下請求時帶上Cache-Control:勾選Disable cache,刷新頁面,可以看到Request Headers中有個字段Cache-Control: no-cache。

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

          Cache-Control字段

          在請求中使用Cache-Control 時,它可選的值有:

          在響應中使用Cache-Control 時,它可選的值有:

          no-store優先級最高

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

          server{listen88;root/opt/ms;indexindex.phpindex.htmlindex.htmindex.nginx-debian.html;location~*^.+\.(css|js|txt|xml|swf|wav)${add_headerCache-Controlno-store;add_headerCache-Controlmax-age=3600;add_headerCache-Controlpublic;add_headerCache-Controlonly-if-cached;add_headerCache-Controlno-cache;add_headerCache-Controlmust-revalidate;}}

          在/opt/ms下增加個文件type.css,內容如下:

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

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

          重復刷新訪問,會發現每次的狀態碼都是200,原因是no-store的優先級最高,本地不保存,每次都需要服務器發送資源。

          public和private的選擇

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

          哪里設置Cache-Control

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

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

          這個指令等同于cache-control: max-age=2592000,同時你會在響應頭部看到一個etag字段,這是由于nginx默認開啟,如果要關閉可以增加個配置etag off。這個etag就是我們接下要看的緩存校驗字段。

          緩存校驗

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

          Last-Modified

          服務端在返回資源時,會將該資源的最后更改時間通過Last-Modified字段返回給客戶端??蛻舳讼麓握埱髸r通過If-Modified-Since或者If-Unmodified-Since帶上Last-Modified,服務端檢查該時間是否與服務器的最后修改時間一致:如果一致,則返回304狀態碼,不返回資源;如果不一致則返回200和修改后的資源,并帶上新的時間。

          If-Modified-Since和If-Unmodified-Since的區別是:

          If-Modified-Since:告訴服務器如果時間一致,返回狀態碼304

          If-Unmodified-Since:告訴服務器如果時間不一致,返回狀態碼412

          etag

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

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

          If-None-Match和If-Match的區別是:

          If-None-Match:告訴服務器如果一致,返回狀態碼304,不一致則返回資源

          If-Match:告訴服務器如果不一致,返回狀態碼412

          總結

          緩存開關是: pragma, cache-control。

          緩存校驗有:Expires,Last-Modified,etag。

          從狀態碼的角度來看,它們的關系如下圖:

          cache-control的各個值關系如下圖

          這是陽光明媚的一天,互聯網里風平浪靜,一切都是欣欣向榮。我就是在這樣一個平凡的日子里誕生了。我給自己起了個名字叫超,不過我的師哥師姐們都喜歡叫我小超。從出生的那...

          網上關于SEO優化的知識很多也很雜,很多新手都不知道如何選擇。本來耗子網站里每篇文章都有的詳細步驟的,考慮到很雜,于是耗子對各種SEO優化基礎知識進行了整理,但...

          今天,我給大家講講如何利用電影貼吧引流輕松變現。這個很適合新手。廢話不多說,直接上干貨。每上映一個新片子,只要這個片子有一定的熱度,馬上該片子的貼吧就會出現各種...

          在互聯網時代,無論是企業還是個人,擁有一個優秀的網站都是必不可少的。然而,擁有一個優秀的網站并不僅僅是頁面設計美觀,更重要的是能夠讓用戶更加容易地找到你的網站。而SEO(Search Engine Optimization)便是幫助你優化網站排名的技巧和方法。本文將為你詳細介紹如何進行SEO優化,從關鍵詞研究到頁面優化,讓你的網站排名一路飆升。一:了解搜索引擎搜索引擎是指通過網絡服務,根據用戶輸入...

          隨著互聯網的快速發展,網站優化也成為了許多企業必備的一項工作。而在眾多搜索引擎中,百度更是占據了絕對的市場份額。因此,掌握百度SEO優化技巧就顯得尤為重要。下面將為大家介紹百度SEO優化的七個步驟。第一步:網站診斷。對網站進行全面的診斷和分析,了解目前的問題和不足之處。第二步:關鍵詞研究。根據網站類型和目標受眾,尋找適合的關鍵詞,并結合具體情況進行篩選和優化。第三步:網站結構優化。從內部結構入手,...

          在互聯網時代,網站首頁是企業或個人在互聯網上展示自我形象和產品的門面。但是,有些網站卻發現自己的首頁無法被百度搜索引擎收錄,這是為什么呢?接下來將探究這個問題。一、網站首頁內容不夠豐富如果網站首頁缺乏獨特、有價值的內容,百度爬蟲會認為此頁面沒有足夠的權重和價值,因而不會進行收錄。因此,網站首頁需要有豐富的內容和獨特的價值主張。二、網站首頁代碼質量不高如果網站首頁代碼質量不高,存在一些結構化問題,如...

          TOP
          国产初高中生视频在线观看|亚洲一区中文|久久亚洲欧美国产精品|黄色网站入口免费进人
          1. <nobr id="easjo"><address id="easjo"></address></nobr>

              <track id="easjo"><source id="easjo"></source></track>
              1. 
                

              2. <bdo id="easjo"><optgroup id="easjo"></optgroup></bdo>
              3. <track id="easjo"><source id="easjo"><em id="easjo"></em></source></track><option id="easjo"><span id="easjo"><em id="easjo"></em></span></option>