Varnish ESI 认可但不包括在内

标签 varnish edge-side-includes

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

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

这是加载结构:

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

<p></p>

同样,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 没有被解析/包含?任何帮助将不胜感激!

最佳答案

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

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

关于 Varnish ESI 认可但不包括在内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4503887/

相关文章:

caching - 反向代理 HTTP 请求的后处理? (如 Akamai 的 ESI)

amazon-cloudfront - CloudFront 与 Edge Side 包括在内吗?

apache - 使用 Varnish 将图像请求重写到 CDN URL

symfony - 登录 ESI 组件中的缓存页面会重定向到/_internal/secure/.../none.html

php - WordPress主题无法上传到Amazon EC2?

varnish - 从缓存发出 Varnish 服务请求(cookies被清除)

rest - 为 REST 资源提供极其激进的 HTTP 缓存的建议

kubernetes - traefik做服务器端包括吗?