我正在尝试使以下模式起作用。我需要在客户端代码中指定一个动态路径,以便能够切换到一些预定义的主机。我通过将它们的别名附加到 /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 返回。我错过了什么?