我使用 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
但是使用最后一个参数,您无法使超时动态化。您需要在某个时候采用一些连贯的工作流程。