Nginx 设置 proxy_set_header 如果 header 存在
Nginx set proxy_set_header if header is present
我正在使用 AWS CloudFront 在到达我的后端之前终止我的 SSL,并且需要将此流量与 non-CloudFront 流量区分开来以在 Nginx 中设置 proxy_set_header
。
我认为最好的方法是检查 X-Amz-Cf-Id
header (added by CloudFront),并在 proxy_set_header
存在时设置它。但是,我知道不可能在 Nginx if 语句中设置 proxy_set_header
,这导致了我的问题。
如何仅在存在 header 时设置 proxy_set_header
值?
一般的答案是可以在if
中设置变量,然后使用该变量。像这样:
set $variable "";
if ($http_X_Amz_Cf_Id) {
set $variable "somevalue";
}
proxy_set_header someheader $variable;
if
语句不是设置自定义 headers 的好方法,因为它们可能 cause statements outside the if block to be ignored.
您可以改用 map directive,这样不会出现同样的问题。
# outside server blocks
map $http_X_Amz_Cf_Id $is_cloudfront {
default "No";
~. "Yes"; # Regular expression to match any value
}
然后:
# inside location block
proxy_set_header X_Custom_Header $is_cloudfront;
我正在使用 AWS CloudFront 在到达我的后端之前终止我的 SSL,并且需要将此流量与 non-CloudFront 流量区分开来以在 Nginx 中设置 proxy_set_header
。
我认为最好的方法是检查 X-Amz-Cf-Id
header (added by CloudFront),并在 proxy_set_header
存在时设置它。但是,我知道不可能在 Nginx if 语句中设置 proxy_set_header
,这导致了我的问题。
如何仅在存在 header 时设置 proxy_set_header
值?
一般的答案是可以在if
中设置变量,然后使用该变量。像这样:
set $variable "";
if ($http_X_Amz_Cf_Id) {
set $variable "somevalue";
}
proxy_set_header someheader $variable;
if
语句不是设置自定义 headers 的好方法,因为它们可能 cause statements outside the if block to be ignored.
您可以改用 map directive,这样不会出现同样的问题。
# outside server blocks
map $http_X_Amz_Cf_Id $is_cloudfront {
default "No";
~. "Yes"; # Regular expression to match any value
}
然后:
# inside location block
proxy_set_header X_Custom_Header $is_cloudfront;