如何在 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。
我的问题是...
如何有条件地添加header?
为什么 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;
如何在 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。
我的问题是...
如何有条件地添加header?
为什么 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;