1

大家好。我在 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> 标记保持不变。它看起来就像您在上面的调试消息中看到的一样。

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

4

2 回答 2

3

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

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

于 2010-12-21T21:41:22.400 回答
2

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

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

例如:

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

于 2011-06-21T21:45:34.603 回答