Назад | Перейти на главную страницу

Лак - Печенье

У меня такая ситуация:

На моем сайте 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. См. Также обсуждение Вот