【问题标题】:How do you set a cookie from within an ESI:include script?如何在 ESI:include 脚本中设置 cookie?
【发布时间】:2011-07-19 17:44:57
【问题描述】:

我有一个通过 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 实现),但我在网上找不到任何关于我的问题的讨论。

【问题讨论】:

    标签: php cookies varnish edge-side-includes


    【解决方案1】:

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

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

    当一个 ESI 模板被处理时,一个 需要单独提出要求 对于遇到的每个包含。 实现可以使用原始的 请求的标头(例如 Cookie、 用户代理等)这样做时。 此外,来自的响应标头 片段(例如,Set-Cookie、服务器、 Cache-Control, Last-Modified) 可能是 忽略,不应该影响 组装页面。

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

    【讨论】:

    • 吸。是的,我可以使用 javascript 路由来设置 cookie,但出于各种原因,我希望不必这样做。我想我会继续尝试找到一种可能的方法来破解它,但我不确定现在是否可行,尤其是在 Varnish 中实现轻量级 ESI 时。
    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2022-09-24
    • 2017-10-14
    • 2018-11-18
    相关资源
    最近更新 更多