我正在尝试使用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 (摘录):
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;
}
}显然,我遗漏了一些东西。如有任何提示,欢迎光临!
发布于 2014-11-10 07:19:33
我不认为帖子中有足够的信息来给你一个明确的答案,但我猜缓存不能正常工作的原因与你的ESI代码无关。
正如在multiple places (here is one example)中提到的,默认情况下,Varnish不会缓存cookie。因此,很可能是在JS中或由PHP会话代码设置的cookie导致您的请求不被缓存。我的猜测是您需要添加:
unset req.http.cookie;在您的if (req.url ~ "^/unique.(js|php)") {块中。
https://stackoverflow.com/questions/26596528
复制相似问题