2014-09-26 65 views
0

我嘗試使用下面的代碼來設置ETAG在我的PHP頁面,ETAG - 如何設置到期時間?

$time  = strtotime(date('Y-m-d H:i:').'00'); 
$lastmod = gmdate('D, d M Y H:i:s \G\M\T', $time); 
$etag  = '123'; 
$ifmod  = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $lastmod : null; 
$iftag  = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? $_SERVER['HTTP_IF_NONE_MATCH'] ==  $etag : null; 

if (($ifmod || $iftag) && ($ifmod !== false && $iftag !== false)) { 
    header('HTTP/1.0 304 Not Modified'); 
    die; 
} else { 
    header("Last-Modified: $lastmod"); 
    header("ETag: $etag"); 
    echo "My Page content"; 
} 

我寫這篇文章的代碼緩存啓用一分鐘,但它並不完美,因爲
strtotime(date('Y-m-d H:i:').'00');沒有給出一個絕對的一分鐘的間隔。

有沒有其他解決方案?

回答

2

我很努力去理解你的問題。我認爲很大一部分原因是因爲Etags與到期時間沒有任何關係。您可以使用Etag作爲過期時間的代理,但這相當重要。

如果您已經提供了正確的緩存信息的內容,那麼客戶端將不會發出條件請求,直到緩存時間已過期。

只有場景,是有意義的使用ETag來管理緩存是你要發佈的內容的大項目(即音頻,視頻和PDF),您必須重新使用相同的網址更新的內容。

strtotime(date('Y-m-d H:i:')。'00');不是絕對的一分鐘間隔

是的,但它是相對於服務器的時鐘,而不是客戶端的時鐘。

除非時鐘同步,否則不可能在正好:00執行到期。但是,如果您設置了max-age = 60和age =`date('s'),那麼對於具有準確時鐘的客戶端而言,這僅適用於未同步客戶端的60秒。

0

是的,我同意symcbean。 Etag與時間到期無關。起初,服務器根據響應生成etag並將其發送給客戶端。客戶獲得響應和etag。如果客戶希望再次獲得響應並返回etag,服務器會再次計算響應並生成一個新的etag,以根據客戶請求與etag進行比較。如果匹配,則發送304.否則直接用新的etag發送響應。

我上面的描述是指服務器不會緩存任何響應的etag,表明Etag沒有到期的概念。