Varnish で ESI 使っていて、なぜか esi:include のタグが処理されず出力されたりする場合が小4時間ほどしらべた(長い!)。
原因は HTML コメントの書き方のせいで、Varnish 3.0.2 で調べる限りはちょっと厳し目のパースをしているっぽい(ソースコード読んだけど、まぁ、僕の C 言語ヂカラではよくわからなかった….)。
だめなのが HTML コメントとしては正しくないコメント開始タグ以降に “-” が複数個連続してあるパターン。
<!----- invalid html comment ----->
<esi:include src="/foo/bar.inc" />
ただし、開始タグがだめでも閉じタグさえ直前に連続 “-” がなければ後ろの ESI が正しく処理される。
<!----- invalid html comment, maybe... -->
<esi:include src="/foo/bar.inc" />
その逆に開始タグが正しくても閉じタグがだめだとダメ。
<!-- invalid html comment, maybe... ----->
<esi:include src="/foo/bar.inc" />
また、HTML的にダメなコメントが1個でもあるとだめかというとそうでもなく、ESI の記述の手前に正しいコメントがあると(たぶんただしく閉じられている場合)処理される。
<!----- invalid html comment!! ----->
<!-- valid comment -->
<esi:include src="/foo/bar.inc" />
回避策として、出力時に毎回すべての HTML コメントを正規化してもよかったけど、今回は esi:include タグ部分を動的変換、出力していたので、esi:include の直前に正しいHTMLコメントいれてやることでひとまず逃れるなどした。
とにもかくにもただしい HTML コメントを記述しましょう。参考:
追記: はてぶで指摘頂いたのでもっかい www.kanzaki.com よんでちょっと文言修正(したんだけど、varnish の動作確認はしてない…)。