我有一个基本的PHP页面通过Varnish加载,其中包含一个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实现),但我在网上找不到任何关于我的问题的讨论。 / p>
答案 0 :(得分:13)
一个有趣的问题,但在(Setting Cookies via ESI:include, how?)之前被问过但未回答。我认为你不能这样做。使用ESI-include,ESI处理器会发出单独的请求,并从主体而不是标头中替换部件。为了使您首选的set-cookie行为正常工作,ESI规范应指定如何“合并”所有set-cookie标头。
参见ESI规范的第六章:http://www.w3.org/TR/esi-lang
处理ESI模板时,a 需要单独提出请求 对于遇到的每个包含。 实现可以使用原始 请求的标题(例如Cookie, 用户代理等)这样做。 此外,响应标头来自 片段(例如,Set-Cookie,Server, Cache-Control,Last-Modified)可能是 忽视了,不应该影响 组装页面。
您可以尝试在javascript set-cookie脚本中转换set-cookie标头吗?这可以包括在身体......