refresh_pattern指令在squid配置文件中定義,此參數控制着數據在磁盤上緩存的時間。
語法如下:
refresh_pattern [-i] regexp min percent max [options]
1,regexp:是匹配正則表達式,注意這裏是區分大小寫的,使用-i選項來定義它忽略大小寫
2,min和max:單位是分鐘,表示某個響應駐留在squid服務器的cache中的時間沒有超過min限制,那麼它不會過期,如果高於這個max限制,那麼它必須被刷新。
3,percent:['Percent' is a percentage of the objects age (time since last modification age) an object without explicit expiry time will be considered fresh.]
要理解percent必須要了解LM-factor算法,在Squid.Definitive.Guide中有張圖,如下:
last-modified和expires定義可以看下圖:(Chrome瀏覽器按下F12進入調試模式)
這裏是一段響應報文首部(我們假設沒有經過web緩存服務器,直接由原始服務器返回的數據)
cache-control:HTTP1.1協議中定義,相對時長(相對於自身服務器時間而言)
expires:HTTP1.0中定義,1.1兼容,絕對時間
可以看到cache-control在某種程度上更加精準。
last-modified:表示在原服務器上最後一次頁面修改的時間。
LM-factor算法定義:
date表示數據從原服務器進入squid緩存服務器的時間。這裏可以看到由percent決定了expires的時間:
expires=date + [ date - (last-modified) ] * percent
所以滿足下面兩個條件之一,則cache數據過期,用戶訪問時必須被refresh。
1)緩存的數據在squid服務器中的時間超出refresh_pattern中定義的max值(相對時長)
2)緩存的數據在squid服務器中的時間超出expires的時間(絕對時間)
4,options中有些選項與http協議相違背:
override-expire:用戶請求時,squid服務器不會先檢查原始服務器響應報文首部expires,而是先檢查min,若小於min值,squid會直接返回一個未確認的cache命中。
override-lastmod:該選項導致先檢查min,再檢查percent。若小於min值,squid會直接返回一個未確認的cache命中。
reload-into-ims:squid在轉發請求之前,對該請求增加一個If-Modified-Since頭部。
ignore-reload:squid服務器將忽略客戶端請求時的no-cache指令。
案例:
refresh_pattern -i \.jpg$ 10080 50% 20160 override-expire ignore-reload reload-into-ims