首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Varnish 4.x by IP缓存ESI片段和相应的输出

如何使用Varnish 4.x by IP缓存ESI片段和相应的输出
EN

Stack Overflow用户
提问于 2014-10-28 04:45:37
回答 1查看 221关注 0票数 1

我正在尝试使用Varnish 4.x中的ESI从我的(PHP)后端获取数据。我想将结果保存(缓存)到我的Varnish实例中。结果对于每个IP地址( client.ip )都是唯一的,因此缓存结果的哈希必须包含client.ip。Varnish没有像预期的那样缓存。我似乎不能基于IP进行缓存。为了让你对我在下面看到的东西有一个概念。

unique.js:

代码语言:javascript
复制
var rand = '<esi:include src="/unique.php"/>';

unique.php:

代码语言:javascript
复制
<?php echo rand(); ?>

default.vcl (摘录):

代码语言:javascript
复制
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;
    }
}

显然,我遗漏了一些东西。如有任何提示,欢迎光临!

EN

回答 1

Stack Overflow用户

发布于 2014-11-10 07:19:33

我不认为帖子中有足够的信息来给你一个明确的答案,但我猜缓存不能正常工作的原因与你的ESI代码无关。

正如在multiple places (here is one example)中提到的,默认情况下,Varnish不会缓存cookie。因此,很可能是在JS中或由PHP会话代码设置的cookie导致您的请求不被缓存。我的猜测是您需要添加:

代码语言:javascript
复制
unset req.http.cookie;

在您的if (req.url ~ "^/unique.(js|php)") {块中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26596528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档