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

我使用Nginx作为caching代理服务器。 我在使用X-Accel-ExpiresCache-Control标头caching响应时遇到了问题。

我的上游返回一些标头为nginx的请求正文:

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

我的意图是,Nginx的caching响应60秒,但客户端将只获得caching控制:无caching头(所以他们不会caching在浏览器中的响应)。

但nginx不caching该响应。 Nginx荣幸Cache-Control头并忽略X-Accel-Expires头。 我认为X-Accel-ExpiresCache-Control的 “更强”,但它不是。

有什么方法可以改变吗?

我知道我可以使用:

 proxy_ignore_headers Cache-Control; 

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


总结当我从上游返回thoose标题:

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

我想在nginxcaching中caching响应60秒,但返回给客户端caching控制:无caching

但是,当我回到这个:

 Cache-Control: max-age=90 

(没有X-Accel-Expires头文件)我想在nginxcaching中caching响应60秒,然后返回给客户端Cache-Control:max-age = 90头文件。

这可能吗?

然后,

  • 修改上游以每次发送X-Accel-Expires标题,或者添加add_header指令(例如,在if语句中使用$http_cache_control )。
  • 每次忽略Cache-Control标头进行caching。
  • 使用上游块。
 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 XXXX: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 ,但是使用这个最后一个参数不能使超时dynamic。 您需要一个连贯的工作stream程。