簡體   English   中英

清漆:刪除一些Cookie問題

[英]Varnish: Remove Some Cookies Issue

我在PHP 5.4.21中使用Varnish 3.0.5和Apache 2.4.6

我在這里閱讀了說明文件

在默認配置下,Varnish將不緩存存在Set-Cookie標頭的來自后端的對象。 另外,如果客戶端發送Cookie頭,則Varnish將繞過緩存並直接進入后端。

因此,為了擁有Varnish現金頁面,我需要刪除從客戶端發送到Varnish的非重要cookie。 目前,僅發送一個cookie,如下所示: 在此處輸入圖片說明

我的default.vcl文件具有以下代碼,該代碼應刪除名稱以下划線字符開頭或名稱為“ has_js”的cookie:

 sub vcl_recv {
 #       //Remove all cookies that begin with an underscore
    set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_\.a-z0-9]+|has_js)=[^;]*", "");
 #       //Remove a ";" prefix, if present.
    set req.http.Cookie = regsub(req.http.Cookie, "^;\s", "");

 #       unset req.http.Cookie;
 ...

我已經從該應用程序測試了正則表達式,如上圖所示,它找到了從客戶端發送的cookie的匹配項。

當我跑步

 ]# varnishes

從命令行中,我發現我沒有“命中”,只有“未命中”。 但是,如果我取消評論

 unset req.http.Cookie;

行,這樣它就刪除了所有Cookie(我從上圖中假設只有一個),我得到了我期望的點擊率。

我希望有人可以向我指出我可能會缺少的東西的正確方向?

謝謝。

上面代碼的問題是default.vcl中的這一行,稍后會被調用:

 if (req.http.Authorization || req.http.Cookie) {
 #         /* Not cacheable by default */
           return (pass);
 }

它已被注釋掉,但仍作為Varnish默認行為的一部分被調用。 如您所見,它正在詢問是否

 req.http.Cookie

存在。 在問題提供的代碼中,變量將仍然存在,但將為空字符串。 此空字符串仍將通過默認的Varnish行為通過邏輯測試。 因此,必須在刪除不想要的cookie的代碼之后添加以下代碼:

 set req.http.Cookie = regsuball(req.http.Cookie, "(^|;\s*)(_[_\.a-z0-9]+|has_js)=[^;]*", "");
 #       //Remove a ";" prefix, if present.
 set req.http.Cookie = regsub(req.http.Cookie, "^;\s", "");

 if (req.http.Cookie == "") {
         unset req.http.Cookie;
 }

現在,如果req.http.Cookie為空,則將刪除該對象,並且Varnish將按預期進行緩存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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