我使用Nginx作为caching代理服务器。 我在使用X-Accel-Expires和Cache-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-Expires是Cache-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程。