我有一个API服务器的Nginx代理. API有时会设置缓存控制标头.如果API没有设置缓存控件,我希望Nginx覆盖它.
我怎么做?
我想我想做这样的事情,但它不起作用.
@H_502_10@location /api { if ($sent_http_cache_control !~* "max-age=90") { add_header Cache-Control no-store; add_header Cache-Control no-cache; add_header Cache-Control private; } proxy_pass $apiPath; }
如果在这里,则不能使用,因为如果作为重写模块的一部分,在请求处理的早期阶段进行评估,则在调用proxy_pass并从上游服务器返回标头之前.
解决问题的一种方法是使用map指令.使用map定义的变量仅在使用时进行评估,这正是您在此处所需的.概略地说,在这种情况下您的配置如下所示:
@H_502_10@# When the $custom_cache_control variable is being addressed # look up the value of the Cache-Control header held in # the $upstream_http_cache_control variable map $upstream_http_cache_control $custom_cache_control { # Set the $custom_cache_control variable with the original # response header from the upstream server if it consists # of at least one character (. is a regular expression) "~." $upstream_http_cache_control; # Otherwise set it with this value default "no-store,no-cache,private"; } server { ... location /api { proxy_pass $apiPath; # Prevent sending the original response header to the client # in order to avoid unnecessary duplication proxy_hide_header Cache-Control; # Evaluate and send the right header add_header Cache-Control $custom_cache_control; } ... }