gpt4 book ai didi

regex - 带有 map 和正则表达式的动态 proxy_pass

转载 作者:行者123 更新时间:2023-12-04 14:29:13 35 4
gpt4 key购买 nike

我正在尝试使以下模式起作用。我需要在我的客户端代码中指定一个动态路径才能切换到几个预定义的主机。我通过将它们的别名附加到/fwd/url 来映射这些主机。别名映射到 nginx 中的真实服务器,如下所示:

map $uri $repoUrl {
default invalid;
~^/fwd/foo/.* http://foo.domain.nl/;
~^/fwd/bar/.* http://bar.domain.nl/;
}

然后在服务器配置部分中,我捕获以 fwd 开头的任何 url 并应用映射的别名值。 url 的其余部分,在别名之后也应该附加到 url 之后。
location /fwd/(\w+)/(.*)$ {
add_header X-FwdHost "$repoUrl$2";
add_header Access-Control-Allow-Origin "*";
proxy_pass "$repoUrl$2";
proxy_redirect off;
access_log on;
}

如果我用以下方法测试:
curl -i http://localhost:8080/fwd/foo/something/else

我得到:
X-FwdHost: http://foo.domain.nl/

但是当测试正则表达式的结果时,我得到:
 $1: foo
$2: something/else

所以总的来说它似乎有效。正则表达式似乎没问题,但我无法将其连接成一个字符串?有什么想法或者有更简单/更好的方法来完成同样的事情吗?

[编辑]

我找到了一种可能更简单的方法,通过使用名为 forward 的查询参数。首先将查询参数映射到正确的主机:
map $arg_forward $repo_forward {
default http://invalid_repo_forward/;

foo http://foo.domain.nl/;
bar http://bar.domain.nl/;

}

然后使用要转发的路径中的参数:
location /fwd/ {
add_header X-FwdHost $repo_forward;
add_header Access-Control-Allow-Origin "*";
proxy_pass $repo_forward;
proxy_redirect off;
access_log on;
}

我希望和网址如下:
http://localhost:8080/fwd/?forward=foo

以导致:
http://foo.domain.nl/

......但这仍然不起作用。我得到一个 404 返回。我错过了什么?

最佳答案

我最终回到了第一种方法,因为为此向 url 添加查询参数并不方便。它使客户端逻辑变得不必要的复杂。

我找到了我的第一种方法的解决方案。位置语句中的正则表达式是错误的。您需要使用 ?像这样:

location ~ ^/fwd/(?<fwd_alias>\w+)/(?<fwd_path>.*)$

然后 $fwd_alias 将包含别名,如 foo 或 bar。 $fwd_path 之后包含整个路径。

要传递包含可选查询参数的完整路径,请将 proxy_pass 指定为:
proxy_pass http://$repo_url$fwd_path$is_args$args;

就是这样!

所以现在,包括第一个示例中的映射,并添加解析器,它归结为:
location ~ ^/fwd/(?<fwd_alias>\w+)/(?<fwd_path>.*)$ {
resolver 8.8.8.8;
add_header Access-Control-Allow-Origin "*";
proxy_pass http://$repo_url$fwd_path$is_args$args;
proxy_redirect off;
access_log on;
}

以及具有以下路径的请求:
http://localhost:8080/fwd/foo/something/else?with=query 

映射到:
http://foo.domain.nl/something/else?with=query

关于regex - 带有 map 和正则表达式的动态 proxy_pass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18452676/

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