Nginx:使用 X-Accel-Expires 和 Cache-Control

Nginx:使用 X-Accel-Expires 和 Cache-Control

我使用 Nginx 作为缓存代理服务器。使用这两种方式缓存响应时,我遇到了问题X-Accel-Expires缓存控制标头。

我的上游向 nginx 返回一些带有标头的请求主体:

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

我的目的是 nginx 将缓存响应 60 秒,但客户端只会获得缓存控制:无缓存标头(因此它们不会在浏览器中缓存响应)。

但 nginx 不会缓存该响应。Nginx 尊重缓存控制标题并忽略X-Accel-Expires标题。我认为X-Accel-Expires缓存控制但事实并非如此。

有什么办法可以改变这种状况吗?

我知道我可以使用:

proxy_ignore_headers Cache-Control;

但我不能这么做,因为我没有X-Accel-Expires来自上游服务器的每个响应中的标头。


总结一下,当我从上游返回这些标头时:

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

我想将响应缓存在 nginx 缓存中 60 秒,然后返回给客户端缓存控制:无缓存

但当我返回时:

Cache-Control: max-age=90

(没有X-Accel-Expires标头)我想将响应缓存在 nginx 缓存中 60 秒并返回给客户端缓存控制: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但是使用最后一个参数,您无法使超时动态化。您需要在某个时候采用一些连贯的工作流程。

相关内容