大話PHP快取頭

2021-09-22 14:16:48 字數 2551 閱讀 7369

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

nginx配置檔案如下:

這個的etag關閉是由於nginx預設是開啟etag的,說明見ngx_http_core_module(

現在我把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個小時是時區導致的。

然後再f5下這個url:

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

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

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

1 開啟fiddler

2 ctrl + f5,這個時候fiddler中多了乙個200響應

3 f5,這個時候fiddler中多了乙個304響應

4 開啟乙個新標籤,在位址列輸入url:  這個時候會發現fiddler並沒有任何請求

5 ctrl + f5,這個時候fiddler多乙個200響應

所以這裡可以驗證之前的文章:http快取相關頭(裡面說的三種重新整理的行為。

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

第一次訪問:

看到這裡使用etag了,etag就相當於乙個版本號,http協議中並沒有規定etag的演算法,它的具體計算就依靠web伺服器自身了。etag還有普通和弱etag的區分(

第二次訪問的時候:

客戶端傳送請求中有個if-none-match,表示客戶端詢問服務端,如果你這邊的這個檔案的tag還是***xx,就返回304吧,不是的話就返回200。

所以if-none-match + etag是可以控制檔案在瀏覽器中的快取的。

關於快取的頭,有些是客戶端的:

cache-control

if-modified-since

if-none-match

有些是服務端的:

expire

last-modified

etag

相關這些頭的說明可以看這篇:http快取相關頭(

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

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

大話PHP快取頭

304的請求機制和200有什麼不一樣呢?在fiddler中檢視304請求的時候突然想到這個問題,就想到研究下這個304請求機制了。我們自己在nginx上放乙個檔案,test.png。可以使用下面的位址進行訪問 nginx配置檔案如下 這個的etag關閉是由於nginx預設是開啟etag的,說明見ng...

php 頭bom php bom頭是什麼

bom頭是一串隱藏的字元,用於讓記事本等編輯器識別這個檔案是否以utf 8編碼。php不會忽略bom,所以在讀取 包含或者引用這些檔案時,會把bom作為該檔案開頭正文的一部分。bom簡介 bom是一串隱藏的字元,用於讓記事本等編輯器識別這個檔案是否以utf 8編碼。類似windows自帶的記事本等軟...

大話PHP設計模式

php魔術方法的使用1.工廠模式,工廠方法或者類生成物件,而不是在 中直接newclass factory 2.單例模式,使某個類的物件僅允許建立乙個 php class database 單例 return database static function getinstance else 3.註...