刚接触清漆。它变得越来越难,超出预期:-(
我正在尝试使用 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);
}