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

Измените заголовок кэша обратного прокси Nginx с публичного на частный

У меня есть кеш-сервер Nginx, получающий контент с исходного сервера, исходный сервер устанавливает Cache-Control к Public поэтому мой кеш-сервер Nginx может кэшировать контент и делать меньше запросов к источнику. Но при обслуживании пользователей я не хочу, чтобы он отправлял кеш как Public больше, но установите его на Private поэтому другие (за пределами этой сети) не могут его кэшировать или изменять.

Мне все еще нужно, чтобы он передавал максимальный возраст, и я пытался сделать это с помощью отправленного настраиваемого заголовка, но if состояние не работает.

только это работает нормально:

add_header Cache-Control "private, max-age=$upstream_http_adr_private_cache_seconds";

это условие не выполняется

if ($upstream_http_adr_private_cache_seconds) {

    add_header Cache-Control "private, max-age=$upstream_http_adr_private_cache_seconds";

}

Но этот тест также терпит неудачу:

if ($upstream_http_adr_private_cache_seconds) {

    return 404;

}

Что я делаю не так ? Или есть другой способ изменить public к private ?

Директивы от ngx_http_rewrite_module обрабатываются до оценки $upstream_... переменные. Вы не должны рассматривать конфигурацию nginx как язык программирования, где ваши операции выполняются последовательно, как они появляются в исходном коде. Например, неважно, используете ли вы proxy_set_header директива перед proxy_pass один или после него. Директивы от ngx_http_rewrite_module это особая история, они отличаются от любых других директив, вы можете прочитать некоторые подробности Вот.

В вашем случае вы можете использовать map перевод:

map $upstream_http_adr_private_cache_seconds $cache_control {
    ""       ""; # empty string if no custom header present
    default  "private, max-age=$upstream_http_adr_private_cache_seconds";
}
...
server {
    ...
    add_header Cache-Control $cache_control;
    ...
}

Если результат $upstream_http_adr_private_cache_seconds к $cache_control translation будет пустой строкой, nginx не будет устанавливать Cache-Control (или любой другой HTTP-заголовок, если в качестве значения параметра директивы add_header передается пустое значение).

Обновить

ОП задал дополнительный вопрос:

если Cache-Control: public заголовок уже существует, то остаются оба заголовка (один public, один private), есть ли способ удалить общедоступный, только если найден настраиваемый заголовок?

Вот решение:

map $upstream_http_adr_private_cache_seconds $cache_control {
    ""       $upstream_http_cache_control; # use original upstream Cache-Control header if no custom header is given
    default  "private, max-age=$upstream_http_adr_private_cache_seconds";
}
...
server {
    ...
    proxy_hide_header Cache-Control; # clear Cache-Control header that came from upstream
    add_header Cache-Control $cache_control; # set Cache-Control header again
    ...
}