【问题标题】:Varnish ESI recognized but not included清漆 ESI 认可但不包括在内
【发布时间】:2011-05-29 01:57:12
【问题描述】:

大家好。我在 Varnish 上使用 Edge Side Includes 来缓存静态 HTML shell,然后包含一些动态 HTML 和 JSON 对象。

HTML 的 ESI 已正确包含,但 JSON 对象的 ESI 未包含;调试语句确定 Varnish 可以看到它,但它莫名其妙地决定不包含 JSON ESI。

这是加载结构:

page uncached. blank page with headers to set a cookie and esi 1
esi 1 cached. A bunch of static HTML, plus esi 2 and esi 3
esi 2 uncached. A JSON object which is different on every page load.
esi 3 uncached. Some HTML which updates with every page load.

同样,esi 1esi 3 工作正常,但 esi 2 没有被包含在内。 esi 2 的内容是这样的:


{session_page_history_id:24231}

我读到看起来不像 XML 的 ESI 代码会导致错误,因此我设置了运行时参数 esi_syntax=0x7 。没有骰子,但至少我现在得到了一些调试数据。

esi 2 的中断调用如下所示:


<esi:include src="http://www.domain.com/dynamic_esi/print_variables?esi__desired_var_names[]=session_page_history_id&for_esi=1"/>

esi 3 的(工作)调用如下所示:


<esi:include src="http://www.domain.com/dynamic_esi/get_service_magic_html?&for_esi=1"/>

正如我所提到的,Varnish 似乎认识到我正在尝试包含 ESI,但这是我从 varnishlog 获得的唯一相关的调试消息:


   25 Debug        c AddBit: 6997 <<![CDATA[

window.esi__values =

<esi:include src="http://www.domain.com/dynamic_esi/print_variables?esi__desired_var_names[]=session_page_history_id&for_esi=1"/>
;

 //]]>
 </script>
 <link rel="stylesheet" href="http://www.

客户端看到的输出包含所有正常内容,但 标记保持不变。它看起来就像您在上面的调试消息中看到的一样。

有谁知道为什么 esi 2 没有被解析/包含?任何帮助将不胜感激!

【问题讨论】:

    标签: varnish edge-side-includes


    【解决方案1】:

    尝试在查询字符串中的“&”之前添加反斜杠。

    至少对我来说,如果你不这样做,Varnish 会忽略除第一个参数之外的所有参数。

    例如:

    也许你会遇到“[”和“]”的问题,它们也需要反斜杠。

    【讨论】:

      【解决方案2】:

      显然 ESI 标记没有得到处理,因为它位于 //[CDATA[ 块中。我确信这与 XML 合规性有关。我认为设置 esi_syntax=7 可以防止这样的问题,但事实证明这只会影响 ESI 本身的内容(它不会解除对包含代码的安全检查)。

      解决方案是重新设计我的应用程序,使 ESI 成为它自己的独立脚本标签。

      【讨论】:

        猜你喜欢
        • 2012-04-22
        • 1970-01-01
        • 2017-04-22
        • 2013-07-16
        • 2015-09-29
        • 2012-11-02
        • 2015-10-21
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多