如何在nginx配置中有条件地添加头信息?

40

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

首先我尝试了这样。

 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设置所有头信息(X-TEST-0,1,2),但实际上它只添加了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 添加了 X-TEST-1 和 X-TEST-2 标头。

我的问题是...

  1. 我如何有条件地添加标头?

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

提前致谢!


2
这是来自 If is evil 的经典案例。 - Alexey Ten
2
你可以在 if 语句内部使用 set。或者使用 map 指令。 - Alexey Ten
感谢提供这些信息!我在您提供的链接页面上找到了我想要的全部内容。 - yazaki
请按照 http://serverfault.com/a/598106/119913 中的说明使用 map - Kevin Smyth
谢谢@KevinSmyth!我稍后会尝试一下。 - yazaki
4个回答

16

如果你有不同的思维方式并使用地图,这将变得简单。

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

# ...later...
location / {
    add_header X-TEST-1   $headervalue;
}
如果$variable的值为1,则设置$headervalue,从而添加标头。默认情况下,$headervalue为空,不会添加标头。
这很有效,因为Nginx只有在需要时(即到达引用$headervalue的点时)才评估映射。
参见类似问题:https://serverfault.com/questions/598085/nginx-add-header-conditional-on-an-upstream-http-variable

4
我认为重要的是要说明map只在http上下文中有效,我曾在服务器上下文中使用它(就在location指令的上方),但是出现了一个关于“在此处不允许使用'map'指令”的错误。 参考链接:http://nginx.org/en/docs/http/ngx_http_map_module.html#map - maganap

6

感谢您提供的有用信息。这可能是对于不介意使用非标准nginx模块的用户的解决方案。我投了+1票。 - yazaki
1
如果有人尝试这样做,请注意正确的Lua语法可能是if ... then ... end :-) - Cosimo

3

(我会为将来遇到同样问题的人写下这个结论。感谢 @Alexey Ten 提供的信息。)

结论:

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

我们可以在名为IfIsEvil的官方文档中获得更多详细信息。


1
@siddhusingh 如果这个问题很受欢迎,那为什么你不给它点赞呢?! - Unicornist
1
刚刚做了。抱歉,我不太习惯这里的投票概念。如果我喜欢答案,我会点赞,但通常会忘记给问题点赞。从现在开始我会注意的。 - siddhusingh
这可能不是正确的答案,但它帮助我解决了一个与缺失响应头相关的问题。 - Vijay Purush
1
该回答被踩是因为它既没有提供任何解决方案,也不是有用的回答 - 仅仅说明为什么使用一种解决方案是不好的并不是一个有用的答案,也不符合社区准则。您可以在解释为什么不好的同时提供一个可行的解决方案,但是如果没有工作解决方案,那么这个回答是无效的。 - tpartee

0
我是这样解决的,我想先打印一个指定的国家符号,首先我映射了geo,如果服务器块中有某些IP,则进行映射。
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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接