使用 cookie 进行清漆缓存

Varnish caching with cookies

刚刚接触 Varnish。越来越难了,比想象中的还要难:-(

我正在尝试改进一些 php 前段时间开发的代码,使用 varnish。 此代码仅使用两个 cookie:PHPSESSID 和 LANGUAGE

如果未定义,所有页面都会设置 PHPSESSID cookie。但是,此用于匿名会话的 cookie 仅在一个页面中使用。

假设我有第 1 页、第 2 页、第 3 页和第 4 页。我的配置应该是这样的:

Page1、Page2 和 Page3 需要 LANGUAGE cookie,并且应与该 cookie 一起缓存:每种语言和页面一个缓存。

Page4 需要 PHPSESSID 和 LANGUAGE cookie,不应缓存,因为它对每个用户都是特定的。

我的 default.vlc 工作不正常,所以任何方向都会非常感激。也许我误解了一些概念。

    sub vcl_init {

    # When requests come to Varnish I need to remove PHPSESSID so it's not used for the hash in caching. Page4 doesn't need caching as it's specific for each user:
       if (req.http.host ~ "Page4") {
         return(pass);
       }

    # remove PHPSESSID so pages1, 2, and 3 get cached just once for everyuser but in all languages.

       if ((req.url !~ "page4")) {
          set req.http.Cookie = regsuball(req.http.Cookie, "PHPSESSID=[^;]+(; )?", "");
       }

   return (hash);


    }

我需要使用 LANGUAGE cookie 缓存网页,所以我将其包含在 vcl_hash:

sub vcl_hash {
  hash_data(req.url);
  if (req.http.host) {
    hash_data(req.http.host);
  } else {
    hash_data(server.ip);
  }

  # hash cookies for requests that have them
  if (req.http.Cookie) {
    hash_data(req.http.Cookie);
  }
}

如何只删除 PHPSESSIONID?

sub vcl_backend_response {
  # Called after the response headers has been successfully retrieved from the backend.

  if (!(bereq.url ~ "Page4"))  {
     unset beresp.http.set-cookie;
  }
  return (deliver);

}

你走在正确的轨道上。如果我理解你的问题,那么不起作用的是你删除了所有 cookie 服务器响应(如果它不是 Page4)而不是仅仅删除 PHPSESSID。

如果 url 不是第 4 页,您可以在 sub vcl_backend_response 中执行正则表达式以仅删除 phpsessionid。

beresp.http.set-cookie = regsuball(beresp.http.set-cookie, "PHPSESSID=[^;]+(; )?", "")

或者,如果您使用 varnish 4 或更高版本,您应该使用 vmod cookie,这使得 cookie 处理更加容易(不再需要正则表达式)。