![Лак — отсоединяйте и прикрепляйте печенье](https://rvso.com/image/782600/%D0%9B%D0%B0%D0%BA%20%E2%80%94%20%D0%BE%D1%82%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D1%8F%D0%B9%D1%82%D0%B5%20%D0%B8%20%D0%BF%D1%80%D0%B8%D0%BA%D1%80%D0%B5%D0%BF%D0%BB%D1%8F%D0%B9%D1%82%D0%B5%20%D0%BF%D0%B5%D1%87%D0%B5%D0%BD%D1%8C%D0%B5.png)
Прежде всего, я прошу выяснить, возможно ли это или нет.
Итак, я вижу, что Varnish не будет кэшировать объекты, если у него есть файлы cookie.
Я думаю о том, что когда входящий запрос содержит куки, Varnish сохранит их в переменных и удалит эти куки, а затем пропустит его на бэкенд. Как только бэкенд закончит обработку, Varnish вернет куки.
возможно ли это?
если да, то как выглядит vcl?
решение1
Контекст
Varnish консервативен в вопросах кэширования и предполагает, что использование cookie-файлов подразумевает определенный уровень персонализации ответа.
Кэширование персонализированного ответа может привести к проблемам с конфиденциальностью или безопасностью. Это также может привести к несогласованному выводу.
Представьте себе кэширование страницы, на которой есть корзина покупок. Кэширование всей страницы приведет к тому, что у всех будет одинаковое значение корзины покупок.
Вот встроенное поведение VCL для Varnish для файлов cookie:
- Когда Varnish видит
Cookie
заголовок в запросе, он не будет обслуживать объект из кэша, поскольку предполагает, что контент персонализирован.
- Когда Varnish видит
Set-Cookie
заголовок в ответе, он не сохраняет объект в кэше, поскольку установка cookie-файла — это изменение состояния, которое также подразумевает персонализацию.
Удаление файлов cookie
После установки cookie-файла через Set-Cookie
заголовок ответа он будет передаваться как Cookie
заголовок запроса для каждого последующего запроса, даже для страниц, которым эти cookie-файлы на самом деле не нужны.
Вот почему важно определить, какие страницы требуют куки, а какие нет. Не менее важно определить отслеживающие куки, поскольку они обрабатываются клиентом в Javascript, а не на сервере.
Вот пример VCL, в котором мы удаляем все файлы cookie, кроме тех, которые нам нужны на сервере:
vcl 4.1;
sub vcl_recv {
if (req.http.Cookie) {
set req.http.Cookie = ";" + req.http.Cookie;
set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
set req.http.Cookie = regsuball(req.http.Cookie, ";(PHPSESSID)=", "; \1=");
set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");
}
if (req.http.cookie ~ "^\s*$") {
unset req.http.cookie;
}
}
В этом случае
PHPSESSID
сохраняется только cookie, поскольку он необходим для отслеживания входов в систему. Если после логики замены этот cookie все еще там, Varnish не будет обслуживать ответ из кэша. Если этот cookie не был установлен, но было много отслеживающих cookie, все cookie удаляются, и страница может обслуживаться из кэша.
Удаление файлов cookie для определенных страниц
Хотя в предыдущем примере были удалены некоторые файлы cookie и сохранены только файлы PHPSESSID
cookie, вы все равно можете оказаться на страницах, которым на самом деле не нужен этот сеансовый файл cookie.
Вот пример VCL, в котором файлы cookie полностью удалены, за исключением страниц, которым действительно нужен определенный файл cookie, например, страницы администратора и страницы корзины покупок:
vcl 4.1;
sub vcl_recv {
if(req.url ~ "^/admin" || req.url == "/cart") {
return(pass);
}
unset req.http.Cookie;
}
Удаление заголовков Set-Cookie
Как показано наhttps://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#dont-cache-responses-with-set-cookie-headers, встроенный VCL не будет сохранять объект в кэше, если Set-Cookie
используется заголовок, поскольку это подразумевает изменение состояния.
Однако это не означает, что страница никогда не попадет в кэш: следующий ответ бэкенда, вероятно, не будет содержать заголовок, Set-Cookie
поскольку cookie уже установлен. В этом случае следующий ответ без Set-Cookie
заголовка может оказаться в кэше.
Однако если вы уверены, что вам не нужно устанавливать cookie для определенных страниц, вы также можете решить удалить заголовок Set-Cookie
.
Следующий пример запрещает бэкэнду устанавливать cookie-файлы для статического контента:
vcl 4.1;
sub vcl_backend_response {
if (bereq.url ~ "^[^?]*\.(7z|avi|bmp|bz2|css|csv|doc|docx|eot|flac|flv|gif|gz|ico|jpeg|jpg|js|less|mka|mkv|mov|mp3|mp4|mpeg|mpg|odt|ogg|ogm|opus|otf|pdf|png|ppt|pptx|rar|rtf|svg|svgz|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") {
unset beresp.http.Set-Cookie;
}
}
Повторное присоединение файлов cookie
Хотя можно сохранить значение cookie-файла в заголовке, а затем удалить cookie-файлы в VCL для их обслуживания из кэша, чтобы затем повторно подключиться для внутренних запросов, это на самом деле не имеет особого смысла.
Зачем отправлять файлы cookie для бэкэнд-запроса, если кэшируемый ответ не нуждается в файлах cookie для создания выходных данных?
Если для формирования выходных данных бэкэнд-запросу требуется значение cookie, это, вероятно, означает, что ответ не будет кэшироваться, поэтому вы можете вообще обойти кэширование для этого запроса.
Следующие шаги
Поскольку ваш вопрос не был очень конкретным, мне пришлось дать вам очень общий ответ.
Если мой ответ полностью отвечает на ваш вопрос, я предлагаю вам указать более подробную информацию о вашем варианте использования, и в ответ я дам вам более подробный ответ.