Nginx 如何使用来自上游主机的响应头,但同时提供默认值?
我有一个nginx conf,它与各种应用程序配对,充当反向代理 我希望强制执行一些特定的响应头,但允许上游服务自由地覆盖它们 如果nginx的继承规则不同,我会这样做Nginx 如何使用来自上游主机的响应头,但同时提供默认值?,nginx,Nginx,我有一个nginx conf,它与各种应用程序配对,充当反向代理 我希望强制执行一些特定的响应头,但允许上游服务自由地覆盖它们 如果nginx的继承规则不同,我会这样做 if ($sent_http_x_content_length = '') { add_header X-Content-Length "nosniff" always; } if ($sent_http_content_type = '') {
if ($sent_http_x_content_length = '') {
add_header X-Content-Length "nosniff" always;
}
if ($sent_http_content_type = '') {
add_header Content-Type "text/html" always;
}
但是,当然,由于它位于if
中,所以前面的if
块会被覆盖
有什么好的解决方法不需要安装更多的
头模块?最终我选择了官方认可的nginx plus更多的头社区模块
map $sent_http_x_powered_by $resp_x_powered_by {
default $sent_http_x_powered_by;
"" "x powered by is empty";
}
map $sent_http_x_foo $resp_x_foo {
default "x foo by is set";
"" "x foo by is empty";
}
server {
add_header "SomeHeader" "SomeValue";
...
location / {
more_set_headers "X-Powered-By: $resp_x_powered_by";
more_set_headers X-Foo $resp_x_foo;
}
工作原理:
more_set_headers
将用提供的值覆盖您指定的头,例如,$resp_x_powered_by
map
块将通过查看$sent\u http\u x\u powered\u by
中的字符串来计算$resp\u x\u powered\u by
如果字符串是”
,那么我们使用默认值“x powered by is empty”
。否则,我们使用来自上游服务器的值
我为什么这样做:
- 最初,我尝试按照劳尔的建议,使用
add_headers
和map
,但问题在于header重复。如果设置了标题,则只需添加另一行即可再次定义标题。一个常见的解决方法是使用proxy\u hide\u header
,但这会将值清空,因此当我们点击map
块时,它将始终计算为“”
- 如您所见,在
位置
块之外有一个add_头
块,它将被范围继承覆盖。有很多方法可以解决这个问题,但是more\u set\u headers
解决了这个问题
最终我选择了官方认可的nginx plusmore\u set\u headers
社区模块
map $sent_http_x_powered_by $resp_x_powered_by {
default $sent_http_x_powered_by;
"" "x powered by is empty";
}
map $sent_http_x_foo $resp_x_foo {
default "x foo by is set";
"" "x foo by is empty";
}
server {
add_header "SomeHeader" "SomeValue";
...
location / {
more_set_headers "X-Powered-By: $resp_x_powered_by";
more_set_headers X-Foo $resp_x_foo;
}
工作原理:
more_set_headers
将用提供的值覆盖您指定的头,例如,$resp_x_powered_by
map
块将通过查看$sent\u http\u x\u powered\u by
中的字符串来计算$resp\u x\u powered\u by
如果字符串是”
,那么我们使用默认值“x powered by is empty”
。否则,我们使用来自上游服务器的值
我为什么这样做:
- 最初,我尝试按照劳尔的建议,使用
add_headers
和map
,但问题在于header重复。如果设置了标题,则只需添加另一行即可再次定义标题。一个常见的解决方法是使用proxy\u hide\u header
,但这会将值清空,因此当我们点击map
块时,它将始终计算为“”
- 如您所见,在
位置
块之外有一个add_头
块,它将被范围继承覆盖。有很多方法可以解决这个问题,但是more\u set\u headers
解决了这个问题
可能的答案?可能的答案?