Как заставить Лак игнорировать, а не удалять куки
Я хочу использовать Varnish для кэширования определенных страниц даже при наличии файлов cookie. Есть 3 варианта, о которых мне нужно позаботиться:
- Анонимный пользователь просматривает какую-то страницу
- Зарегистрированный пользователь просматривает некоторую страницу с легкой настройкой. Все эти настройки хранятся в подписанном файле cookie и динамически заполняются Javascript. Заголовок var-cookie http не установлен.
- Зарегистрированный пользователь просматривает некоторую страницу с настроенными данными из базы данных. Заголовок var-cookie http установлен.
Ожидаемое поведение будет:
- Кэшируйте страницу. Это самый простой сценарий для Varnish.
- Кэшируйте страницу и не удаляйте cookie, потому что это требуется для некоторой логики Javascript.
- Никогда не кэшируйте эту страницу, потому что var-cookie сигнализирует о том, что содержимое куки повлияет на вывод этой страницы.
Я прочитал некоторые документы по Varnish, и я не могу сказать, является ли это поведением по умолчанию или есть какая-то настройка, которую я должен сделать в VCL, чтобы это произошло.
2 ответа
По умолчанию Varnish не кэширует запросы с заголовком Cookie:
http://varnish-cache.org/svn/trunk/varnish-cache/bin/varnishd/default.vcl
sub vcl_recv {
(...)
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass);
}
return (lookup);
Вам нужно кодировать поведение, которое вы хотите в конфигурации. Помните, что Cookie - это часть запроса клиента, а не "страница" (объект, на самом деле). "Страница" (объект) поставляется с заголовком "Set-Cookie", который будет кэшироваться.
Кроме того, "Vary: Cookie" не означает "не кэшировать". Это означает кэширование одного объекта для каждого полученного значения Cookie.
Если ваше приложение не генерирует контент, основанный на Cookie, возможно, его можно игнорировать:
- if (req.http.Authorization || req.http.Cookie) {
+ if (req.http.Authorization) {
Сделайте несколько тестов, и вы освоите его. Надеюсь это поможет.
Если я вас правильно понимаю, вам не нужен определенный файл cookie как часть ключа - но вам нужно оставить его без изменений?
Вам нужно установить хеш в vcl_hash как req.url + req.http.host (и, возможно, другие), но не конкретный cookie.
Я думаю, что один из моих постов может помочь вам в правильном направлении: игнорирование GET-параметров в Varnish VCL