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;