大話PHP緩衝頭

來源:互聯網
上載者:User

標籤:style   blog   http   使用   檔案   width   

304的請求機制和200有什麼不一樣呢?在fiddler中查看304請求的時候突然想到這個問題,就想到研究下這個304請求機制了。

我們自己在nginx上放一個檔案,test.png。可以使用下面的地址進行訪問:

http://test.yejianfeng.com/test.png

 

nginx設定檔如下:

這個的etag關閉是由於nginx預設是開啟etag的,說明見ngx_http_core_module(http://nginx.org/en/docs/http/ngx_http_core_module.html)。

現在我把etag關閉了,這個test.png的HTTP請求如下:

可以看到這裡的Response Header 中Last-Modified並沒有設定到期,所以Last-Modified是不生效的。加上沒有其他的相關緩衝頭,這個時候,瀏覽器就沒有緩衝這個頁面了。所以呢,不管你黏貼URL,F5 還是Ctrl F5,頁面進行的請求Cache-Control都是設定no-cache,所以服務端響應都是200。

下面,修改nginx配置,增加一個expires 1d:

重啟nginx,HTTP請求如下:

可以看出這裡的Expires比Date多一天,所以就是服務端告訴用戶端,你給我在本機快取一天吧。

那麼這個時候使用F5:

返回的就是304了,這個時候,就是本地瀏覽器緩衝了這個頁面,發送條件請求給服務端,條件請求裡面帶一個If-Modified-Since,用戶端詢問服務端,這個檔案瀏覽器這邊有緩衝,如果你服務端的檔案在這個時間點有更改,就發送一個更改後的檔案給我,沒有的話就發送一個304就好。

這裡還有個問題,這個Last-Modified是怎麼定的呢?它就是這個檔案在伺服器上的最後修改時間。

圖中的15:31和last-Modified的07:31中間的8個小時是時區導致的。

我們touch來修改這個檔案的最後修改時間:

然後再F5下這個URL:

服務端返回200了,而且Last-Modified也修改了。這個就很好理解了。

 

如果我不是使用F5,而是將url直接貼到瀏覽器呢?這個時候,瀏覽器的行為就是如果本地有緩衝,就使用本地的緩衝,如果本地沒有緩衝,就請求服務端。

我們可以做的實驗是這樣:

1 開啟fiddler

2 ctrl + F5,這個時候fiddler中多了一個200響應

3 F5,這個時候fiddler中多了一個304響應

4 開啟一個新標籤,在地址欄輸入url:http://test.yejianfeng.com/test.png  這個時候會發現fiddler並沒有任何請求

5 ctrl + F5,這個時候fiddler多一個200響應

所以這裡可以驗證之前的文章:HTTP緩衝相關頭(http://www.cnblogs.com/yjf512/p/3244882.html)裡面說的三種重新整理的行為。

 

回到緩衝頭,清空瀏覽器的緩衝,把expire的設定去掉,把etag開啟

第一次訪問:

看到這裡使用ETag了,ETag就相當於一個版本號碼,HTTP協議中並沒有規定etag的演算法,它的具體計算就依靠web伺服器自身了。ETag還有普通和弱ETag的區分(http://en.wikipedia.org/wiki/HTTP_ETag)。

第二次訪問的時候:

用戶端發送請求中有個If-None-Match,表示用戶端詢問服務端,如果你這邊的這個檔案的tag還是XXXXX,就返回304吧,不是的話就返回200。

所以If-None-Match + ETag是可以控制檔案在瀏覽器中的緩衝的。

 

關於緩衝的頭,有些是用戶端的:

Cache-Control

If-Modified-Since

If-None-Match

有些是服務端的:

Expire

Last-Modified

ETag

 

相關這些頭的說明可以看這篇:HTTP緩衝相關頭(http://www.cnblogs.com/yjf512/p/3244882.html)

 

好了,下面說一種情景:

我們再nginx中做了一個rewrite,所有的js都重寫到myjs.php這個指令碼,那麼問個問題,js在F5的時候會發送條件請求,這個條件請求是不是會觸發php呢?

 

答案是會的。條件請求也是一個普通的php請求,它會在觸發php的。這個時候如果你需要返回304的話,就需要你在php程式中對If-modified或者If-None-Match進行判斷了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.