Рейтинг:0

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

флаг ke

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

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

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

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

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

сервер {
    server_name myservername.tld
    слушать 80;

    место расположения / {
        proxy_cache $PROXY_CACHE;

        proxy_cache_valid 200 302 60 м;
        proxy_cache_valid 404 1 м;
        proxy_cache_use_stale ошибка timeout http_429 http_500 http_502 http_503 http_504;
        proxy_cache_background_update включено;
        proxy_cache_revalidate включен;
        proxy_cache_min_uses 1;
        proxy_cache_lock включен;

        прокси_пароль $схема://$APACHE_PROXY_REQ_IP:$APACHE_PROXY_REQ_PORT;
    }

}
Michael Hampton avatar
флаг cz
Пожалуйста, опубликуйте свой блок nginx `server`.
флаг ke
Я добавил блок «сервер». Спасибо!
Рейтинг:1
флаг cz

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

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

proxy_no_cache $cookie_sessionid;

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

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.