8

我有一个通过 Varnish 加载的基本 PHP 页面,其中包含一个 ESI 包含回调到服务器以设置 cookie。cookie 是通过域访问等设置的,但是当通过 ESI 调用时,cookie 永远不会设置。如果您直接访问 ESI 包含路径,则 cookie 设置没有问题。我什至将我的 Varnish 配置设置为从不缓存任何内容,认为 VCL 可能会杀死 cookie。

这个...

<esi:include src="/init.php?<?=http_build_query($_GET); ?>"></esi:include>

...包括这个...

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

setcookie('superman', 'clark kent', 0, '/', '.whatever.com');

?>

我是 Varnish 和 ESI 的新手,所以我开始怀疑这是否是一个已知的限制(无论是 ESI 还是 Varnish 的 ESI 实现),但我在网上找不到任何关于我的问题的讨论。

4

1 回答 1

13

一个有趣的问题,之前被问过 - 但没有回答 - (通过 ESI 设置 Cookie:包括,如何?)。我不认为你可以这样做。使用 ESI-include,ESI 处理器发出一个单独的请求并替换正文中的一部分,而不是标题。为了使您首选的 set-cookie 行为正常工作,ESI 规范应指定如何“合并”所有 set-cookie 标头。

请参阅 ESI 规范的第六章:http: //www.w3.org/TR/esi-lang

处理 ESI 模板时,需要为遇到的每个包含发出单独的请求。当这样做时,实现可能会使用原始请求的标头(例如,Cookie、User-Agent 等)。此外,来自片段(例如,Set-Cookie、Server、Cache-Control、Last-Modified)的响应标头可能会被忽略,并且不应影响组装的页面。

您可以尝试在 javascript set-cookie 脚本中转换您的 set-cookie 标头吗?这可以包含在正文中...

于 2011-03-21T15:13:17.083 回答