如何在 nginx 配置中有条件地添加 header?

How can I add header conditionally in nginx configuration?

如何在 nginx(1.4.6 ubuntu) 配置中有条件地添加 header?

一开始我是这样试的

 location / {
      add_header X-TEST-0 always-0;

      set $true 1;
      if ($true) {
          add_header X-TEST-1 only-true;
      }

      add_header X-TEST-2 always-2;
  }    

虽然我希望我的 nginx 设置所有 header(X-TEST-0,1,2),但它只添加了 header X-TEST-1.

接下来我这样试了

 location / {
      add_header X-TEST-0 always-0;

      ##set $true 1;
      ##if ($true) {
      ##    add_header X-TEST-1 only-true;
      ##}

      add_header X-TEST-2 always-2;
  }    

我的 nginx 按照我的预期添加了 header X-TEST-1 和 X-TEST-2。

我的问题是...

  1. 如何有条件地添加header?

  2. 为什么 nginx 在我上面的第一个例子中只添加 X-TEST-1?

提前致谢!

(我会写这个结论给以后有同样问题的人。感谢@Alexey Ten 提供信息。)

结论:

不要在 if 指令中使用任何非重写指令。 因为 if 指令本质上是重写模块的一部分。

我们可以在名为 IfIsEvil.

的官方文档中获得更多详细信息

我用lua nginx module解决了类似的问题:

localtion / {
  header_filter_by_lua_block {
    ngx.header["X-TEST-0"] = "always-0";
    # example of conditional header
    if ngx.req.get_method() == ngx.HTTP_POST {
      ngx.header["X-TEST-1"] = "only if POST request";
    }
    ngx.header["X-TEST-2"] = "always-2";
  }
}    

https://github.com/openresty/lua-nginx-module#header_filter_by_lua_block ```

如果您有不同的想法并使用地图,这很简单。

map $variable  $headervalue {
    1        only-true;
    default  '';
}

# ...later...
location / {
    add_header X-TEST-1   $headervalue;
}

如果 $variable 为 1,将设置 $headervalue,因此将添加 header。 默认情况下 $header 值将为空并且不会添加 header。

这是高效的,因为 Nginx 仅在需要时才评估映射(当它到达引用 $headervalue 的点时)。

查看类似内容:https://serverfault.com/questions/598085/nginx-add-header-conditional-on-an-upstream-http-variable

我这样解决的,我想打印一个指定国家的符号 首先,如果服务器中的某些 IP 块

,我映射 geo
geo $CNTRY {
    default '';
    192.104.49.0/24 ML;
    192.104.46.0/24 ML;
    192.104.47.0/24 ML;
}

然后我只需将它添加到服务器块,(任何地方都无所谓)

add_header x-CNTRY $CNTRY;