微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有map和regexp的动态proxy_pass

我正在尝试使用以下模式.我需要在客户端代码中指定一个动态路径才能切换到一些预定义的主机.我通过将它们的别名附加到/ 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/

但是当测试regexp的结果时,我得到:

 $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;
}

我希望和url像:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐