Warm tip: This article is reproduced from serverfault.com, please click

其他-Nginx:将X-Accel-Expires与Cache-Control一起使用

(Nginx: using X-Accel-Expires with Cache-Control)

发布于 2021-03-10 08:06:41

我正在使用Nginx作为缓存代理服务器。我在使用X-Accel-ExpiresCache-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头。

这可能吗?

Questioner
Tereska
Viewed
0
Xavier Lucas 2014-11-02 19:42:37

然后,

  • 修改上游以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;
   }

}

对于最后一种情况,请参考第一个点或use proxy_cache_valid,但是使用最后一个参数,你将无法使超时动态化。你一次需要一些连贯的工作流程。