簡體   English   中英

啟用cookie時,Varnish不會緩存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM