Nginx: использование X-Accel-Expires с Cache-Control

Я использую Nginx в качестве кеширующего прокси-сервера. У меня проблемы с кэшированием ответов с использованием заголовков X-Accel-Expires и Cache-Control.

Мой апстрим возвращает некоторое тело запроса с заголовками в nginx:

[...]
X-Accel-Expires: 60
Cache-Control: no-cache
[...]

Я хочу, чтобы nginx кэшировал ответ в течение 60 секунд, но клиенты получат только заголовок Cache-Control: no-cache (поэтому они не будут кэшировать ответ в браузере).

Но nginx не кеширует этот ответ. Nginx соблюдает заголовок Cache-Control и игнорирует заголовок X-Accel-Expires. Я думал, что X-Accel-Expires "сильнее", чем Cache-Control, но это не так.

Есть ли способ изменить это?

Я знаю, что я могу использовать:

proxy_ignore_headers Cache-Control;

Но я не могу этого сделать, потому что у меня нет заголовков X-Accel-Expires в каждом ответе от вышестоящего сервера.


Подводя итог, когда я возвращаю заголовки thoose из верхнего потока:

X-Accel-Expires: 60
Cache-Control: no-cache

Я хочу кэшировать ответ в nginx кеш на 60 с, но возвращаюсь к клиентам Cache-Control: no-cache.

Но когда я вернусь это:

Cache-Control: max-age=90

(без заголовка X-Accel-Expires) Я хочу кэшировать ответ в кеше nginx в течение 60 с и вернуть клиентам Cache-Control: заголовок max-age=90.

Это возможно?

1 ответ

Решение

Затем,

  • Изменить вышестоящий поток для отправки X-Accel-Expires заголовок каждый раз или добавьте его add_header директива (используя, например, $http_cache_control в операторе if).
  • игнорировать Cache-Control заголовок для кэширования каждый раз.
  • Используйте вышестоящий блок.
map $upstream_http_cache_control $cache_control_value {
    "~^max-age=(?<duration>\d+)$" "$duration";
}

сервер {

   listen 127.0.0.1:80;

    upstream nodes {
        server foo;
    }

    location / {

        if ($upstream_http_x_accel_expires = '') {
            add_header "X-Accel-Expires" $cache_control_value;
        }

        proxy_set_header "Host" $host;
        proxy_pass http://nodes;
    }

}

сервер {

   server_name mydomain.com;

   listen X.X.X.X:80;

   upstream intermediate {
       server 127.0.0.1;
   }

   location / {
       proxy_set_header "Host" $host;
       proxy_pass http://intermediate;
       proxy_ignore_headers 'Cache-Control';
       proxy_cache mycache;
   }

}

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

Другие вопросы по тегам