我正在尝试使用Varnish 4.x中的ESI从我的(PHP)后端获取数据。我想将结果保存(缓存)到我的Varnish实例中。结果对于每个IP地址(client.ip)都是唯一的,因此缓存结果的哈希必须使用client.ip构建。 Varnish没有按预期缓存。我似乎无法基于IP缓存。为了让您了解我尝试过的内容,请参阅下文。
unique.js:
var rand = '<esi:include src="/unique.php"/>';
unique.php:
<?php echo rand(); ?>
default.vcl(extract):
sub vcl_recv {
if (req.url ~ "^/unique.(js|php)") {
set req.http.marker = client.ip;
}
}
sub vcl_hash {
if (req.http.marker) {
hash_data(req.http.marker);
}
}
sub vcl_backend_response {
if (bereq.url == "/unique.js") {
set beresp.do_esi = true;
set beresp.ttl = 24h;
} elseif (bereq.url == "/unique.php") {
set beresp.ttl = 30d;
}
}
显然我错过了一些东西。任何提示都表示赞赏!
答案 0 :(得分:0)
我认为帖子中没有足够的信息可以给你一个明确的答案,但我的猜测是,由于与你的ESI代码无关的原因,缓存无法正常工作。
如多个地方(here is one example)所述,默认情况下,Varnish不会使用Cookie进行缓存。所以很可能是在JS或PHP会话代码中设置的cookie导致您的请求不被缓存。我的猜测是你需要添加:
unset req.http.cookie;
在if (req.url ~ "^/unique.(js|php)") {
区块内。