Как избежать сумасшедшего кэширования с заголовком «Vary: Cookie» в NGINX

Я знаю Vary: Cookie не очень любят ], поскольку он вызывает кеширование всех вариантов файлов cookie, о которых может сообщить пользователь. С другой стороны, без него мне пришлось использовать Cache-Control: no-cache , чтобы указать моему кэширующему серверу NGINX полностью пропустить кэширование содержимого, которое могло зарегистрировать пользователя in (кстати, на каждой странице моего сайта, поскольку в верхней части страницы есть поле учетной записи).

Я отправляю файлы cookie только в том случае, если пользователь входит в систему, поэтому большинство просмотров страниц выиграют от кеширования.Я хотел бы сузить его так, чтобы было только два варианта: кешированная версия для пользователей, чья «вариация» состоит в том, что у них есть нет файлов cookie, и некэшированная версия для тех, у кого есть файлы cookie (например, пользователь вошел в систему и имеет файлы cookie аутентификации).

Если я добавлю «Vary: Cookie» в свою программу на Perl, могу ли я сказать NGINX, что в этом случае он должен обращать внимание только на то, существует ли cookie sessionId или нет? Что-то вроде - для создания псевдозаголовка - Vary: Cookie ('sessionId') ? Если есть способ реализовать это в заголовке, создаваемом сценарием, который NGINX будет уважать, я бы предпочел, чтобы это было помещено в конфигурацию NGINX, но любое решение будет оценено.

Я не совсем уверен, как проверить, заставлю ли NGINX сойти с ума с кешированием, но мне интересно, может ли что-то в этом роде сработать: на зрителе, который не вошел в систему, сценарий отправляет Варьируется: Cookie , но для пользователя, который находится в системе, он отправляет и этот заголовок, и Cache-Control: no-cache . Поймет ли это NGINX, что он говорит ему кэшировать первый ответ, но не вариант? Или я что-то напутаю так, как сейчас не улавливаю?

Обновление: Вот пример одного из моих серверных блоков:

server {
    server_name myservername.tld
    listen 80;

    location / {
        proxy_cache $PROXY_CACHE;

        proxy_cache_valid 200 302 60m;
        proxy_cache_valid 404 1m;
        proxy_cache_use_stale error timeout http_429 http_500 http_502 http_503 http_504;
        proxy_cache_background_update on;
        proxy_cache_revalidate on;
        proxy_cache_min_uses 1;
        proxy_cache_lock on;

        proxy_pass $scheme://$APACHE_PROXY_REQ_IP:$APACHE_PROXY_REQ_PORT;
    }

}
0
задан 6 July 2021 в 20:40
1 ответ

Вам следует обратить внимание на директивы proxy_no_cache и proxy_cache_bypass.

proxy_no_cache указывает nginx условия, при которых он не должен кэшировать ответ от вашего приложения. Вы можете определить это как угодно, например:

proxy_no_cache $cookie_sessionid;

proxy_cache_bypass работает в другом направлении: он указывает nginx, когда запрос не должен обслуживаться из кэша, а передаваться вашему приложению, даже если кэшированная запись существует.

1
ответ дан 28 July 2021 в 14:06

Теги

Похожие вопросы