Nginx 如何使用来自上游主机的响应头,但同时提供默认值?

Nginx 如何使用来自上游主机的响应头,但同时提供默认值?,nginx,Nginx,我有一个nginx conf,它与各种应用程序配对,充当反向代理 我希望强制执行一些特定的响应头,但允许上游服务自由地覆盖它们 如果nginx的继承规则不同,我会这样做 if ($sent_http_x_content_length = '') { add_header X-Content-Length "nosniff" always; } if ($sent_http_content_type = '') {

我有一个nginx conf,它与各种应用程序配对,充当反向代理

我希望强制执行一些特定的响应头,但允许上游服务自由地覆盖它们

如果nginx的继承规则不同,我会这样做

        if ($sent_http_x_content_length = '') {
            add_header X-Content-Length "nosniff" always;
        }
        if ($sent_http_content_type = '') {
            add_header Content-Type "text/html" always;
        }
但是,当然,由于它位于
if
中,所以前面的
if
块会被覆盖


有什么好的解决方法不需要安装更多的
模块?

最终我选择了官方认可的nginx plus
更多的头
社区模块

map $sent_http_x_powered_by $resp_x_powered_by {
    default   $sent_http_x_powered_by;
    ""        "x powered by is empty";
}
map $sent_http_x_foo $resp_x_foo {
    default   "x foo by is set";
    ""        "x foo by is empty";
}

server {
  add_header "SomeHeader" "SomeValue";
  ...
  location / {
    more_set_headers "X-Powered-By: $resp_x_powered_by";
    more_set_headers X-Foo $resp_x_foo;
  }
工作原理:

  • more_set_headers
    将用提供的值覆盖您指定的头,例如,
    $resp_x_powered_by
  • map
    块将通过查看
    $sent\u http\u x\u powered\u by
    中的字符串来计算
    $resp\u x\u powered\u by
  • 如果字符串是
    ,那么我们使用默认值
    “x powered by is empty”
    。否则,我们使用来自上游服务器的值
  • 我为什么这样做:

    • 最初,我尝试按照劳尔的建议,使用
      add_headers
      map
      ,但问题在于header重复。如果设置了标题,则只需添加另一行即可再次定义标题。一个常见的解决方法是使用
      proxy\u hide\u header
      ,但这会将值清空,因此当我们点击
      map
      块时,它将始终计算为
      “”
    • 如您所见,在
      位置
      块之外有一个
      add_头
      块,它将被范围继承覆盖。有很多方法可以解决这个问题,但是
      more\u set\u headers
      解决了这个问题

    最终我选择了官方认可的nginx plus
    more\u set\u headers
    社区模块

    map $sent_http_x_powered_by $resp_x_powered_by {
        default   $sent_http_x_powered_by;
        ""        "x powered by is empty";
    }
    map $sent_http_x_foo $resp_x_foo {
        default   "x foo by is set";
        ""        "x foo by is empty";
    }
    
    server {
      add_header "SomeHeader" "SomeValue";
      ...
      location / {
        more_set_headers "X-Powered-By: $resp_x_powered_by";
        more_set_headers X-Foo $resp_x_foo;
      }
    
    工作原理:

  • more_set_headers
    将用提供的值覆盖您指定的头,例如,
    $resp_x_powered_by
  • map
    块将通过查看
    $sent\u http\u x\u powered\u by
    中的字符串来计算
    $resp\u x\u powered\u by
  • 如果字符串是
    ,那么我们使用默认值
    “x powered by is empty”
    。否则,我们使用来自上游服务器的值
  • 我为什么这样做:

    • 最初,我尝试按照劳尔的建议,使用
      add_headers
      map
      ,但问题在于header重复。如果设置了标题,则只需添加另一行即可再次定义标题。一个常见的解决方法是使用
      proxy\u hide\u header
      ,但这会将值清空,因此当我们点击
      map
      块时,它将始终计算为
      “”
    • 如您所见,在
      位置
      块之外有一个
      add_头
      块,它将被范围继承覆盖。有很多方法可以解决这个问题,但是
      more\u set\u headers
      解决了这个问题
    可能的答案?可能的答案?