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

时间:2015-04-06 08:15:13

标签: nginx

如何在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?

  3. 提前致谢!

3 个答案:

答案 0 :(得分:5)

我使用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 ```

答案 1 :(得分:1)

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

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

答案 2 :(得分:-2)

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

结论:

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

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