У меня есть кеш-сервер 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
...
}