[英]Varnish does not cache when cookies are enabled
我使用Varnish 3,網站是wordpress。 問題是當我刪除所有cookie和set-cookie頭時,varnish緩存很好。 但是我需要根據cookie來制作清漆來緩存頁面。 (我的網站內容取決於地理位置,所以當用戶第一次登錄時,我添加cookie'revenive_country')首先,我刪除所有set-cookies標頭:
# Drop any cookies Wordpress tries to send back to the client.
sub vcl_fetch {
if (!(req.url ~ "wp-(login|admin)")) {
unset beresp.http.set-cookie;
}
}
然后:默認情況下,varnish不會緩存具有cookie的請求。 這是通過默認的vcl_fetch邏輯完成的。 所以我改變了默認的vcl_fetch並注釋掉了cookie禁令(參見/*|| req.http.Cookie*/
):
sub vcl_recv {
if (req.restarts == 0) {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
if (req.http.Authorization /*|| req.http.Cookie*/) {
/* Not cacheable by default */
return (pass);
}
return (lookup);
}
在那之后,我預計清漆將緩存頁面與cookie,但它不是:-(但它應該緩存!不是嗎?
如果我刪除所有cookie,它可以緩存:
sub vcl_recv {
if (!(req.url ~ "wp-(login|admin)")) {
remove req.http.Cookie;
}
}
請幫忙! 我花了很多時間來找出它沒有緩存的原因
除了您注釋掉的部分之外,默認VCL中沒有任何內容可以防止varnish緩存對包含cookie的請求的響應。 但是,后端服務器仍需要在標頭中指示varnish來緩存給定頁面。 在wordpress中渲染頁面時,您希望清除緩存,請將此標頭添加到響應中:
Cache-Control: public, max-age=600
其中600表示將此頁面緩存10分鍾,86400表示1天,等等。如果這樣做,您必須非常小心,不要使用請求中存在的地理位置cookie來生成響應的任何部分否則所有用戶都將收到相同位置的內容,無論用戶發起緩存請求的位置。 如果頁面的任何部分需要使用位置cookie,則需要使用esi:include標記對其進行渲染,該標記將生成對后端的單獨請求,其結果可以告訴varnish不要緩存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.