Nginx如何在未设置的情况下添加标头

18

如果未设置,则我想在nginx中添加一个标题(Cache-control)。

我需要通过nginx中的标头在某些情况下增加缓存时间。


1
我也有同样的问题,而且这个问题并没有任何有价值的答案。我想在头部添加一个X-correlationId,并使用uuid来设置它(如果它还没有被设置)。这是否可能? - jmcollin92
1个回答

26

您可以使用 map 来填充变量 $cachecontrol。如果客户端的请求头$http_cache_control为空,则设置自定义值。否则(默认情况下)重用客户端的值。

map $http_cache_control $cachecontrol {
    default   $http_cache_control;
    ""        "public, max-age=31536000";
}

接着您可以使用该变量发送上游头信息。

proxy_set_header X-Request-ID $cachecontrol;

对于jmcollin92提出的后续问题,我在SO Documentation中写了以下内容,现在转录如下。

X-Request-ID

nginx

反向代理可以检测客户端是否提供X-Request-ID头,并将其传递给后端服务器。如果没有提供此类标题,则可以提供一个随机值。

map $http_x_request_id $reqid {                                                 
    default   $http_x_request_id;                                               
    ""        $request_id;                                                      
}

上面的代码将请求ID存储在变量$reqid中,可以随后在日志中使用。

log_format trace '$remote_addr - $remote_user [$time_local] "$request" '        
                 '$status $body_bytes_sent "$http_referer" "$http_user_agent" ' 
                 '"$http_x_forwarded_for" $reqid';                              

它也应该传递给后端服务

location @proxy_to_app {
    proxy_set_header X-Request-ID $reqid;
    proxy_pass   http://backend;
    access_log /var/log/nginx/access_trace.log trace;
}

map 不能在另一个块内使用。这使得它在子配置文件中无法使用。 - Tofandel
进一步澄清@Tofandel的评论,它仍然可以用于在嵌套块中使用的变量,因为map是惰性评估的。唯一的注意点是map本身需要在顶层指定。 - aksh1618

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接