正确包含了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 1 和 esi 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.
客户端看到的输出包含所有正常内容,但使用&lt; esi&gt;标签保持完整。它看起来就像您在上面的Debug消息中看到的那样。
有谁知道为什么esi 2没有被解析/包含?任何帮助都会非常感激!
答案 0 :(得分:1)
显然,ESI标签没有得到处理,因为它位于// [CDATA [块]内。我确信这与XML合规性有关。我认为设置esi_syntax = 7可以防止出现这样的问题,但事实证明这只会影响ESI本身的内容(它不会解除对包含这些内容的代码的安全检查)。
解决方案是重新编写我的应用程序,以便ESI是它自己的独立脚本标记。
答案 1 :(得分:1)
尝试在“&amp;”之前添加反斜杠在查询字符串中。
至少和我一起,Varnish会忽略所有参数,但如果你不这样做,则会忽略第一个参数。
例如为:
也许你会遇到“[”和“]”的问题,他们也需要反斜杠。