1

皆さんこんにちは。Varnish で Edge Side Includes を使用して静的 HTML シェルをキャッシュし、動的 ​​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 に答える