У меня такая ситуация:
На моем сайте javascript устанавливает файл cookie, содержащий соответствующую информацию для создания разметки.
Поэтому я хочу, чтобы Varnish кэшировал каждую страницу отдельно для каждого значения указанного файла cookie.
Во всей найденной мной документации говорится, что Varnish не будет кэшировать, если есть какие-либо файлы cookie, и объясняет, как удалить файлы cookie при предварительной обработке Varnish.
Это явно не то, что я хочу, я хочу кэшировать, даже если присутствует определенный файл cookie, но отдельно для каждого значения файла cookie.
Любой способ добиться этого?
Это возможно
Например:
sub vcl_recv {
set req.http.X-COOKIEHASH = "";
if (req.http.Cookie ~ "COOKIEHASH=") {
set req.http.X-COOKIEHASH = regsub(req.http.Cookie,"^.*?COOKIEHASH=([^;]*);*.*$", "\1");
/* to prevent default action when cookies are present */
/* this is shortcut - you should adjust this to your VCL logic */
return (lookup);
}
}
sub vcl_hash {
hash_data(req.http.X-COOKIEHASH);
}
sub vcl_miss {
unset bereq.http.X-COOKIEHASH;
}
sub vcl_pass {
unset bereq.http.X-COOKIEHASH;
}
В vcl_recv () мы извлекаем значение для cookie (с именем COOKIEHASH), а в vcl_hash () мы добавляем это значение в хэш-функцию.
Это пример для одного файла cookie. Но легко добавить больше имен файлов cookie. Вы также должны помнить о том, что нужно иметь дело с другими файлами cookie (отбросить их или игнорировать).
Это началось как комментарий к ответу RJS - но он становится немного длинным ...
IIRC (не делайте много вещей с Varnish), вам нужно указать все детерминанты уникальности в vcl_hash - следовательно, ответ RJS может быть неправильным - действительно примеры в руководстве явно используйте URL-адрес, а также другие индикаторы.
Думаю, есть проблемы с тем, как RJS извлекает cookie. Предполагая, что значение cookie находится в req.http.X-COOKIEHASH, решение будет следующим:
sub vcl_hash {
hash_data(req.url);
hash_data(req.http.X-COOKIEHASH);
}
Следствием этого является то, что Varnish начнет кэширование копий контента, который не зависит от файла cookie - следовательно, вы можете исключить URL-адреса статического содержимого из использования файлов cookie для определения хэша.
Однако это не помогает решить проблему для других кешей - как промежуточных, так и браузерных. Контент должен обслуживаться заголовком Vary: Cookie. См. Также обсуждение Вот