【问题标题】:Nginx set proxy_set_header if header is presentNginx 设置 proxy_set_header 如果标头存在
【发布时间】:2017-04-17 09:56:39
【问题描述】:

我正在使用 AWS CloudFront 在访问我的后端之前终止我的 SSL,并且需要将此流量与非 CloudFront 流量区分开来以在 Nginx 中设置 proxy_set_header

我相信最好的方法是检查 X-Amz-Cf-Id 标头 (added by CloudFront),并在 proxy_set_header 存在时设置它。但是,我知道在 Nginx if 语句中设置 proxy_set_header 是不可能的,这导致了我的问题。

如何仅在存在该标头时设置proxy_set_header 值?

【问题讨论】:

  • 当它终止 SSL 时,您不能在亚马逊云前端设置该标头吗?
  • 感谢@seb,我尝试将自定义标题设置为标题名称 = proxy_set_header 和值 = X-Forwarded-Proto https,但它没有按预期工作。我需要将它添加到我的 Nginx 配置的特定行中,所以不要认为这种方法会起作用。我的最终目标是告诉我的应用 CF 连接是通过 HTTPS 进行的。
  • 我不使用云前端,但快速搜索给了我这个结果:docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/… 所以云前端能够设置标题。如果云前端可以设置标头,那么在此处设置标头比在 nginx 中更有意义。或者您可以搜索并找到此解决方案:serverfault.com/questions/506972/…
  • 谢谢,我已经阅读了您链接的那些页面,但无法弄清楚。如前所述,我在 CloudFront 中设置了标头。根据this answerproxy_set_header 指令设置了 Nginx 发送到后端的标头,所以我相信我仍然需要 Nginx 中的指令,如果我遗漏了什么,请纠正我。
  • 我检查了来自 CloudFront 的请求标头,它们包括 CloudFront-Forwarded-Proto: https,所以我设置了 proxy_set_header X-Forwarded-Proto $http_cloudfront_forwarded_proto;,这似乎正在完成这项工作。我猜这个变量在不可用时变为 nil 。将进行更多测试并将其标记为答案,如果它坚持。

标签: ssl nginx amazon-cloudfront


【解决方案1】:

if 语句不是设置自定义标头的好方法,因为它们可能是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;

【讨论】:

  • 应该是建议地图的可接受答案。没测试过~。 “是的”。
  • 但是很容易出现需要脱离服务器块的问题,在某些情况下这不是一个选项(例如:plesk)
【解决方案2】:

一般的答案是,您可以在if 中设置变量,然后使用该变量。像这样:

set $variable "";
if ($http_X_Amz_Cf_Id) {
  set $variable "somevalue";
}
proxy_set_header someheader $variable;

【讨论】:

  • 这不受此警告的约束:“Nginx 的“if”块有效地创建了一个(嵌套的)位置块,一旦“if”条件匹配,只有内部位置块的内容处理程序(即, "if" 块) 将被执行。" - agentzh.blogspot.co.uk/2011/03/how-nginx-location-if-works.html ?
  • 是的,但是内部位置块(“if”)继承了外部块的内容处理程序(它本身没有)。您的链接提到了这一点:“3。内部块没有任何内容处理程序,ngx_proxy 继承了外部范围内的内容处理程序(ngx_proxy 的处理程序)(参见 src/http/modules/ngx_http_proxy_module.c:2025)。”跨度>
猜你喜欢
  • 2012-11-15
  • 2020-12-30
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
相关资源
最近更新 更多