0

刚接触清漆。它变得越来越难,超出预期:-(

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

如果未定义,所有页面都会设置 PHPSESSID cookie。然而,这个用于匿名会话的 cookie 只在一个页面中使用。

假设我有 Page1、Page2、Page3 和 Page4。我的配置应该如下:

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);

}
4

1 回答 1

1

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

sub vcl_backend_response如果 url 不是 Page4 ,您可以在您的 regexp 中仅删除 phpsessionid。

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

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

于 2017-02-25T08:48:54.567 回答