使用 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 处理更加容易(不再需要正则表达式)。
刚刚接触 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 处理更加容易(不再需要正则表达式)。