2011-03-21 23 views
8

我有一个基本的PHP页面通过Varnish加载一个ESI包括回调到服务器来设置一个cookie。该cookie设置了域访问等,但通过ESI调用时,cookie从未设置。如果您直接访问ESI包含路径,则设置cookie不会有任何问题。我甚至把我的Varnish配置设置为永不缓存任何东西,认为VCL可能会杀死cookie。如何从ESI:include脚本中设置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'); 

?> 

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

回答

13

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

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

当处理一个ESI模板,一个 单独的请求将需要进行 每个包括遇到。 实施时可能会使用原始的 请求的标头(例如,Cookie, 用户代理等)。 此外,来自 片段(例如,设置Cookie,服务器, 缓存控制,最后修改)的响应头可以被忽略,并且不应该影响组装的页面 。

你可以尝试在javascript set-cookie脚本中转换你的set-cookie头吗?这可以包括在身体...

+0

吸。 是的,我可以去javascript路由设置cookie,但我希望不必因为各种原因这样做。 我想我会继续试图找到一种可能的方法来破解这个,但我不确定现在可能,特别是在光油ESI实施在光油。 – 2011-03-21 15:29:08