如何在ESI中设置cookie:include脚本?

时间:2011-03-21 14:28:30

标签: php cookies varnish edge-side-includes

我有一个基本的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>

1 个答案:

答案 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标头吗?这可以包括在身体......