訪問CDN加速內容返回304狀態碼是否正常
更新時間 2023-12-15 20:34:54
最近更新時間: 2023-12-15 20:34:54
分享文章
本文介紹訪問CDN加速內容返回304狀態碼的原因及解決方案。
問題現象
域名使用CDN加速后,針對部分請求資源CDN節點會返回304狀態碼。
問題原因
客戶端首次向CDN服務器成功發送URL請求后,服務器會響應200狀態碼,內容是客戶端請求的資源,同時會有一個Last-Modified的屬性標記此文件在服務器端最后被修改的時間和一個用來核實內容是否修改過的Etag標記。等下次同一客戶端再次向服務器發送相同URL請求時會攜帶文件最后修改時間和文件實體標簽的請求頭,服務器會根據攜帶的請求頭比對文件修改時間和Etag標記判斷文件內容在這期間是否修改過。如果服務器端的文件沒有變化,則自動返回304(Not Changed)狀態碼,此時客戶端會直接加載緩存內容;如果在此期間文件內容修改過,則服務器端把最新內容返回給客戶端,并返回最新的文件修改時間和Etag,具體示例如下:
- 客戶端首次成功訪問一個文件時,服務器會返回200狀態碼,響應頭中(Response Header)會攜帶標識文件最近修改時間的Last-Modified和Etag。


- 當客戶端再次發起相同URL文件的訪問時,客戶端會攜帶請求頭If-Modified-Since/If-None-Match值為首次請求該URL響應頭Last-Modified/Etag的頭部值(如下圖所示),服務器會根據請求頭中If-Modified-Since/If-None-Match攜帶的值對比Last-Modified和Etag是否一致來判斷內容最近是否有做過變更。當文件和之前保持一致(未被修改過),則返回給客戶端304狀態碼,如果文件內容變更過,則把最新內容返回客戶端,同時響應200狀態碼。

解決方案
304狀態碼屬于正常情況,說明請求的文件內容已經在客戶端緩存中存在,而且在這段時間中對應的資源內容沒有做過變更。在已有緩存的情況下,如果客戶端希望重新拉取文件,可以通過“ Ctrl+F5 ”刷新的方式清除緩存,此時客戶端會對服務器發起新的訪問,且不會再攜帶If-Modified-Since/If-None-Match請求頭,從而獲取相應的文件內容和200狀態碼。