我想在 Cache-Control 標頭中找到單獨的 max-age 和帶有 must-revalidate 的 max-age 之間的區別。
我用這兩種方法對 chrome 進行了驗證。
max-age=10 - 這意味著回應在 10 秒后不再有效,客戶端必須到達服務器以獲取新結果,并且不應在 10 秒后提供快取的回應或清除回應。
max-age=10, must-revalidate - 這里 must-revalidate 定義相同的東西,但是服務器可以有 304 回應,瀏覽器即使在 10 秒后也可以使用快取的資料。
假設與場景 1 不同,瀏覽器必須清除快取并期待來自服務器的新回應,而在場景 2 中,瀏覽器可以保留快取回應并期待 304 狀態或新回應。
但是,實際上在 chrome 中,上面的陳述是不正確的,即使我們用 403 回應,chrome 仍然提供來自快取的回應,這意味著沒有區別。下面是 rest api 的代碼示例。
var ccpublicWrongResp = 3;
var ccpublicWrongRespCount = 0;
app.get('/ccpublic', function (req, res) {
console.log(req.url " - " new Date().getSeconds());
ccpublicWrongRespCount ;
if(ccpublicWrongRespCount >= ccpublicWrongResp){
console.log("Sending 304");
res.statusCode = (304);
res.send();
}else{
res.set('Cache-Control', 'public, max-age=12');
res.send("Please check after 12 seconds ");
}
});
var j = 1;
app.get('/mustrevalidate', function (req, res) {
console.log(req.url " - " new Date().getSeconds());
j ;
ccpublicWrongRespCount ;
if(ccpublicWrongRespCount >= ccpublicWrongResp){
console.log("Sending 304");
res.statusCode = (304);
res.send();
}else{
res.set('Cache-Control', 'public, max-age=12, must-revalidate');
res.send(j " with must-revalidate");
}
});
uj5u.com熱心網友回復:
首先要了解的是,快取將盡可能嘗試重新驗證陳舊的資源(而不是獲得完整的回應)。這就是為什么您在兩個測驗中看到相同行為的原因。
接下來,了解在某些情況下允許快取提供陳舊的回應;特別是,如果他們無法連接到原始服務器。
現在我們可以看到must-revalidate. 這只是意味著快取永遠不應該提供陳舊的回應。
回應指令表明,
must-revalidate一旦它變得陳舊,快取不得使用回應來滿足后續請求,而無需在源服務器上成功驗證。
換句話說,您將指令解釋為“必須重新驗證而不是獲得完整回應”,但它實際上意味著“必須重新驗證而不是提供過時的內容,即使在快取能夠這樣做的情況下也是如此”。
請注意,在大多數情況下,使用此標頭是不合適的:
must-revalidate當且僅當未能驗證對表示的請求可能導致不正確的操作時,服務器才應該使用該指令。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/483784.html
