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

yaz*_*aki 27 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;
  }    
Run Code Online (Sandbox Code Playgroud)

虽然我期望我的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;
  }    
Run Code Online (Sandbox Code Playgroud)

我的nginx按照我的预期添加了标题X-TEST-1和X-TEST-2.

我的问题是......

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

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

提前致谢!

Ed *_*all 11

如果您以不同的方式思考并使用地图,这很简单。

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

# ...later...
location / {
    add_header X-TEST-1   $headervalue;
}
Run Code Online (Sandbox Code Playgroud)

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

这是有效的,因为 Nginx 仅在需要时评估地图(当它到达引用 $headervalue 的点时)。

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

  • 我认为添加地图仅在 http 上下文中有效很重要。我在服务器上下文中使用它(位于位置指令的正上方),并收到有关“此处不允许使用“map”指令”的错误。http://nginx.org/en/docs/http/ngx_http_map_module.html#map (2认同)

kor*_*rya 5

我使用lua nginx模块来解决类似的问题:

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";
  }
}    
Run Code Online (Sandbox Code Playgroud)

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