Моя команда использует nginx скэшПроблема в том, что приложение в восходящем потоке отправляет некоторые заголовки, которые мы хотели бы переопределить.в кэшированном объекте. Можно увидеть заголовки, сохраненные в кэшированном объекте, если поискать в кэше ключ (или часть ключа). Например
cd /var/cache/nginx/test
grep -inr part_of_key *
Binary file 6/29/7bcd0cd0aadfd536cdd7183cd8b77296 matches
тогда можно сделать
strings 6/29/7bcd0cd0aadfd536cdd7183cd8b77296
# content with keys, cached headers and so on
Конфигурация nginx (упрощенная)
# part of server1
location / {
proxy_pass http://upstream;
proxy_cache zone1;
}
Теперь я знаю директиву proxy_hide_header
и я пытался удалить (и заменить) заголовки в кэшированном объекте, но это не работает. Кажется, что процесс следующий:
- восходящий поток отправляет ответ
- nginx читает ответ
- ответ сохраняется в файле в кэше
- над ответом выполняются такие операции, как удаление заголовков, для отправки ответа клиенту
Поэтому, по-видимому, нет возможности повлиять на заголовки ответа до того, как он будет сохранен в кэше.
Один из обходных путей, который я мог бы разработать, — просто поместить в середину еще один сервер nginx, чтобы он мог изменять заголовки, которые затем сохранялись в кэше в server1
.
Пример
# part of server1
location /
proxy_pass http://upstream-modify-headers;
proxy_set_header Host modify.headers;
proxy_cache zone1;
}
# the upstream
upstream upstream-modify-headers {
server 127.0.0.1:80;
}
#the host that modifies the headers
server {
listen *:80;
server_name modify.headers;
add_header "cache-control" "public, max-age=10, must-revalidate";
...
location / {
proxy_pass http://upstream;
proxy_hide_header cache-control; #one example header that should be modified in the cache
}
...
allow 127.0.0.1; #only locally available
}
Это работает, но требует дополнительных хостов nginx.Можно ли вместо этого переопределить заголовки в кэшированном объекте на том же сервере nginx, не добавляя дополнительный объект в восходящем потоке?
решение1
Похоже, вы ищете proxy_hide_header
директиву.
решение2
В качестве обходного пути попробуйте добавить метку даты в заголовках. Добавьте ее, и тогда вы сможете отличить, какие заголовки из кэша, а какие новые (сравнив журнал доступа с другими метками времени)