如何在nginx中仅有时添加headers
How to add headers in nginx only sometimes
我有一个 API 服务器的 nginx 代理。 API 有时设置缓存控制 header。如果 API 没有设置缓存控制,我希望 nginx 覆盖它。
我该怎么做?
我想我想做这样的事情,但是没有用。
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;
}
你不能在这里使用 if
,因为 if
作为重写模块的一部分,在请求处理的早期阶段被评估,远远早于 proxy_pass
调用并从上游服务器返回 header。
解决问题的一种方法是使用 map
指令。用 map
定义的变量只有在使用时才被评估,这正是您在这里所需要的。粗略地说,您在这种情况下的配置如下所示:
# 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;
}
...
}
Ivan Tsirulev 的回答是正确的,但您不必使用正则表达式。
Nginx 自动使用 map
的第一个参数作为默认值,因此您也不必添加它。
# Get value from Http-Cache-Control header but override it when it's empty
map $upstream_http_cache_control $custom_cache_control {
'' "no-store, no-cache, private";
}
server {
...
location /api {
# Use the value from map
add_header Cache-Control $custom_cache_control;
}
...
}
我有一个 API 服务器的 nginx 代理。 API 有时设置缓存控制 header。如果 API 没有设置缓存控制,我希望 nginx 覆盖它。
我该怎么做?
我想我想做这样的事情,但是没有用。
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;
}
你不能在这里使用 if
,因为 if
作为重写模块的一部分,在请求处理的早期阶段被评估,远远早于 proxy_pass
调用并从上游服务器返回 header。
解决问题的一种方法是使用 map
指令。用 map
定义的变量只有在使用时才被评估,这正是您在这里所需要的。粗略地说,您在这种情况下的配置如下所示:
# 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;
}
...
}
Ivan Tsirulev 的回答是正确的,但您不必使用正则表达式。
Nginx 自动使用 map
的第一个参数作为默认值,因此您也不必添加它。
# Get value from Http-Cache-Control header but override it when it's empty
map $upstream_http_cache_control $custom_cache_control {
'' "no-store, no-cache, private";
}
server {
...
location /api {
# Use the value from map
add_header Cache-Control $custom_cache_control;
}
...
}