![Лак ESI не работает](https://rvso.com/image/617238/%D0%9B%D0%B0%D0%BA%20ESI%20%D0%BD%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82.png)
У меня такая конфигурация: - nginx порт 80 - Varnish (3.0.4) порт 6081 - apache порт 8080
Nginx принимает запрос и передает его Varnish, который затем проверяет кэш и затем либо возвращает ответ из кэша, либо передает запрос Apache. В Apache я отключил mod_deflate, чтобы вывод не сжимался. Внутри Varnish я включил ESI для всех запросов, например:
sub vcl_fetch {
set beresp.do_esi = true;
}
А мой тестовый файл (test.php) выглядит так:
Current time is: <esi:include src="/date.php" />
Дата.php:
<?php
echo date('H:i:s');
Но Varnish не обрабатывает esi include. В varnishlog я получаю эту ошибку:
11 ESI_xmlerror c No ESI processing, first char not '<'
Заголовки ответа от 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
И HTML-вывод:
Current time is: <esi:include src="/name.php" />
Итак, вы видите, что ESI не обрабатывается.
Что я делаю не так?
решение1
Решено... если первый символ ответа сервера не "<", ESI работать не будет. Решением моей проблемы было просто обернуть тестовый файл в стандартную структуру HTML, чтобы он выглядел так:
<html>
<head>
<title></title>
</head>
<body>
Current time is: <esi:include src="/name.php" />
</body>
</html>
решение2
Другой способ — запустить демон Varnish с параметром:
-p esi_syntax 0x3
что значит
0x00000001 - Don't check if it looks like XML
0x00000002 - Ignore non-esi elements