gpt4 book ai didi

nginx - 在 nginx 配置中有条件地映射值

转载 作者:行者123 更新时间:2023-12-04 15:36:14 26 4
gpt4 key购买 nike

我有一个场景,我想根据可以出现在 header 中或作为查询参数的值将请求proxy_pass 到多个上游目标之一。

现在,我已经基本弄清楚了基于 header 的映射:

map $http_x_destination $destination {
default upstream0;
something upstream1;
something2 upstream1;
something3 upstream2;
}
...

server {
location / {
proxy_pass https://$destination;
}
}

显然这适用于我们有 header 的情况,但不适用于目标基于操作的情况。我最初的直觉是使用某种条件逻辑来查看 header 是否存在,如果存在,则根据 $http_x_target 构建映射,否则根据 $arg_target 构建映射.

但是我已经阅读了很多不要使用 if 的劝告,因为它被认为是危险的,而且因为我不知道 nginx 首先是如何处理定义的范围的(更不用说在if block ),我对这种方法持怀疑态度。

是否有合并这两个信息源的好方法,以便将它们的值清晰地映射到上游?

最佳答案

如果你想先映射$http_x_target,再映射$arg_target,有几个解决方案。

您可以创建一个复杂的字符串值,如 "$http_x_target:$arg_target" 并使用正则表达式检查分隔符的每一侧。

例如:

map "$http_x_target:$arg_target" $destination {
default upstream0;
~something upstream1;
~something2 upstream1;
~something3 upstream2;
}
...
server {
location / {
proxy_pass https://$destination;
}
}

您可以使用 ~^something:~:something$ 等正则表达式来测试字符串中 : 的每一侧。


或者通过使用第一个的值作为第二个的默认值来级联两个映射。

例如:

map $arg_target $arg_destination {
default upstream0;
something upstream1;
something2 upstream1;
something3 upstream2;
}
map $http_x_target $destination {
default $arg_destination;
something upstream1;
something2 upstream1;
something3 upstream2;
}
...
server {
location / {
proxy_pass https://$destination;
}
}

两个映射必须控制不同的变量名(例如$destination$arg_destination)。

参见 this document了解详情。

关于nginx - 在 nginx 配置中有条件地映射值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59671623/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com