1

我正在尝试使用 Varnish 4.x 中的 ESI 从我的 (PHP) 后端获取数据。我想将结果保存(缓存)在我的 Varnish 实例中。结果对于每个 IP 地址 (client.ip) 都是唯一的,因此缓存结果的哈希必须包含 client.ip。Varnish 没有按预期缓存。我似乎无法基于 IP 进行缓存。为了让您了解我尝试过的内容,请参见下文。

独特的.js:

var rand = '<esi:include src="/unique.php"/>';

独特的.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;
    }
}

显然我错过了一些东西。任何提示表示赞赏!

4

1 回答 1

0

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

正如多处提到的(这里是一个例子),Varnish 默认不缓存 cookie。所以很可能是在 JS 或 PHP 会话代码中设置的 cookie 导致您的请求没有被缓存。我的猜测是您需要添加:

unset req.http.cookie;

在你的if (req.url ~ "^/unique.(js|php)") {街区内。

于 2014-11-09T23:19:33.113 回答