ziguzagu.org

Valid HTML comment description for Varnish ESI

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 の動作確認はしてない…)。