如何在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。
我的问题是......
如何有条件地添加标题?
为什么nginx在上面的第一个例子中只添加了X-TEST-1?
提前致谢!
答案 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的官方文档中获取有关它的更多详细信息。