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

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

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

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

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

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

Но nginx не кэширует этот ответ. Nginx честь Кэш-контроль заголовок и игнорирование X-Accel-истекает заголовок. я думал что X-Accel-истекает "сильнее", чем Кэш-контроль но это не так.

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

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

proxy_ignore_headers Cache-Control;

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


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

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

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

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

Cache-Control: max-age=90

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

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

Затем,

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

server {

   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 {

   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, но с этим последним параметром вы не можете сделать тайм-аут динамическим. В какой-то момент вам нужен согласованный рабочий процесс.