gpt4 book ai didi

caching - 维护包含 ESI 的请求的 session

转载 作者:行者123 更新时间:2023-12-02 17:02:06 26 4
gpt4 key购买 nike

我在设置 Varnish 来正确处理 ESI 包含的子请求的 session cookie 时遇到问题。

背景,SSCCE

三个文件:index.phpnavigation.phpfooter.php 使用 ESI 组合在一起,其中前两个文件是有状态的,但只有 index.php 是可缓存的,而 footer.php 是完全无状态的。

### index.php
<?php

session_start();

header('Cache-Control: public, s-maxage=10');
header('Surrogate-Control: content="ESI/1.0"');

?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />

<title>Varnish test</title>
</head>
<body>
<esi:include src="http://localhost/WWW/navigation.php" />
<p>Primary content: <?php echo date('r') ?></p>
<esi:include src="http://localhost/WWW/footer.php" />
</body>
</html>

### footer.php
<?php

header('Cache-Control: public, s-maxage=20');

?>
<p>Footer: <?php echo date('r') ?></p>

### navigation.php
<?php

session_start();

if (!isset($_SESSION['counter'])) {
$_SESSION['counter'] = 0;
}

$_SESSION['counter'] += 1;

header('Cache-Control: private');

?>
<p>Navigation: <?php echo $_SESSION['counter'] ?></p>

Varnish VCL 配置:

sub vcl_recv {
set req.http.Surrogate-Capability = "abc=ESI/1.0";
}

sub vcl_fetch {
if (beresp.http.Surrogate-Control ~ "ESI/1.0") {
unset beresp.http.Surrogate-Control;

set beresp.do_esi = true;
}
}

sub vcl_deliver {
if (obj.hits > 0) {
set resp.http.X-Cache = "HIT";
} else {
set resp.http.X-Cache = "MISS";
}
}

期望的结果

我希望看到 index.php/footer.php 从缓存中加载,每 10/20 秒清除一次,而 navigation.php 直接从后端服务器加载。当然,对 index.php 的第一个请求无法缓存,因为必须设置 Set-Cookie header ,但是可以加载 footer.php从一开始就从缓存中获取。

<小时/>

我怎样才能实现这一目标?我知道 HTTP 请求中存在 Cookie header 会导致缓存未命中,但我不能简单地将其删除。

最佳答案

与其说是答案,不如说是评论,但太长了,无法融入其中。

上面的示例缺乏转义 Varnish 默认 VCL [1],如果您不避免的话,Varnish 总是会将其默认逻辑附加到您的 VCL 代码 [2]。

在这种情况下,您至少需要:

sub vcl_recv {
set req.http.Surrogate-Capability = "abc=ESI/1.0";
return (lookup);
}

除非您强制执行,否则 Varnish 也不会缓存任何包含 Set-Cookie header 的响应。

[1] https://www.varnish-cache.org/docs/3.0/reference/vcl.html#examples

[2] https://www.varnish-software.com/static/book/VCL_Basics.html#the-vcl-state-engine

关于caching - 维护包含 ESI 的请求的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18021000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com