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