[英]Varnish ESI recognized but not included
大家好 我在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 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.
客戶端看到的輸出包含所有正常內容,但<esi>標記保持不變。 看起來就像您在上面的調試消息中看到的一樣。
有誰知道為什么不解析/包含esi 2? 任何幫助將不勝感激!
顯然,ESI標簽沒有得到處理,因為它位於// [CDATA [塊]內。 我確信這與XML合規性有關。 我認為設置esi_syntax = 7可以防止出現這樣的問題,但事實證明這只會影響ESI本身的內容(它不會解除對包含這些內容的代碼的安全檢查)。
解決方案是重新處理我的應用程序,以便ESI是它自己的自包含腳本標記。
嘗試在查詢字符串中的“&”之前添加反斜杠。
至少對於我來說,Varnish會忽略所有參數,但如果您不這樣做,則會忽略第一個參數。
例如:
也許你會遇到“[”和“]”的問題,他們也需要反斜杠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.