Как установить cookie из скрипта ESI: include? - PullRequest
8 голосов
/ 21 марта 2011

У меня есть базовая страница PHP, загружаемая через Varnish с одним включением ESI, которое вызывает сервер, чтобы установить cookie. Файл cookie устанавливается с доступом к домену и т.п., но при вызове через ESI файл cookie никогда не устанавливается. Если вы обращаетесь к пути включения ESI напрямую, файл cookie устанавливается без проблем. Я даже настроил свою конфигурацию Varnish так, чтобы она никогда ничего не кэшировала, думая, что VCL может уничтожить куки.

Этот ...

<esi:include src="/init.php?<?=http_build_query($_GET); ?>"></esi:include>

... включает в себя это ...

<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT");

setcookie('superman', 'clark kent', 0, '/', '.whatever.com');

?>

Я новичок в Varnish и ESI, поэтому я начинаю задумываться, не является ли это известным ограничением (либо в ESI, либо в реализации ESI Varnish), но я не могу найти обсуждения моей проблемы в Интернете.

1 Ответ

13 голосов
/ 21 марта 2011

Интересный вопрос, который был задан - но не отвечен - раньше ( Настройка Cookies через ESI: включите, как? ).Я не думаю, что вы можете сделать это таким образом.При использовании ESI-include процессор ESI делает отдельный запрос и заменяет часть из тела, а не заголовок.Для правильной работы предпочтительного поведения set-cookie в спецификации ESI должно быть указано, как «объединять» все заголовки set-cookie.

См. Шестую главу спецификации ESI: http://www.w3.org/TR/esi-lang

При обработке шаблона ESI необходимо будет сделать отдельный запрос для каждого обнаруженного включения.При этом реализации могут использовать заголовки исходного запроса (например, Cookie, User-Agent и т. Д.).Кроме того, заголовки ответа от фрагментов (например, Set-Cookie, Server, Cache-Control, Last-Modified) могут игнорироваться и не должны влиять на собранную страницу.

Не могли бы вы попытаться преобразовать свойзаголовок set-cookie в сценарии javascript set-cookie?Это может быть включено в тело ...

...