![Varnish ESI funktioniert nicht](https://rvso.com/image/617238/Varnish%20ESI%20funktioniert%20nicht.png)
Ich habe eine Konfiguration wie diese: - Nginx-Port 80 - Varnish (3.0.4)-Port 6081 - Apache-Port 8080
Nginx nimmt die Anfrage entgegen und übergibt sie an Varnish, das dann den Cache überprüft und dann entweder die Antwort aus dem Cache zurückgibt oder die Anfrage an Apache übergibt. In Apache habe ich mod_deflate deaktiviert, damit die Ausgabe nicht gzippt wird. In Varnish habe ich ESI für alle Anfragen wie diese aktiviert:
sub vcl_fetch {
set beresp.do_esi = true;
}
Und meine Testdatei (test.php) sieht folgendermaßen aus:
Current time is: <esi:include src="/date.php" />
Die date.php:
<?php
echo date('H:i:s');
Aber Varnish verarbeitet das ESI-Include nicht. Im Varnishlog erhalte ich diesen Fehler:
11 ESI_xmlerror c No ESI processing, first char not '<'
Antwort-Header von test.php:
Accept-Ranges:bytes
Age:3
Connection:keep-alive
Content-Length:51
Content-Type:text/html
Date:Sun, 01 Sep 2013 11:51:57 GMT
Server:nginx
Surrogate-Control:"ESI/1.0"
Via:1.1 varnish
X-Powered-By:PHP/5.4.15-1~precise+1
X-Varnish:1236304062 1236304061
Und die HTML-Ausgabe:
Current time is: <esi:include src="/name.php" />
Sie sehen also, dass ESI nicht verarbeitet wird.
Was mache ich falsch?
Antwort1
Gelöst … wenn das erste Zeichen der Serverantwort nicht „<“ ist, funktioniert ESI nicht. Die Lösung für mein Problem bestand einfach darin, die Testdatei in eine Standard-HTML-Struktur zu verpacken, sodass sie folgendermaßen aussieht:
<html>
<head>
<title></title>
</head>
<body>
Current time is: <esi:include src="/name.php" />
</body>
</html>
Antwort2
Eine andere Möglichkeit besteht darin, den Varnish-Daemon mit dem Parameter auszuführen:
-p esi_syntax 0x3
was bedeutet
0x00000001 - Don't check if it looks like XML
0x00000002 - Ignore non-esi elements