Nginx proxy_pass如何传递路由参数

时间:2020-06-30 07:35:00

标签: docker nginx endpoint nginx-reverse-proxy nginx-config

我正在尝试对内部docker容器进行api调用,但是对于每个请求url,我都必须在Nginx配置中进行proxy_pass。我读过一些文章,最后的斜杠应该可以将所有URL传递给proxy_pass。

Read here (redirect table)


示例

www.example.com/api->重定向到正确的端点

www.example.com/api/2020->这不会重定向到http:// api / 2020

配置

location = /api/ {
   proxy_pass http://api/;
}

那么,为什么此配置不将2020“参数”传递给api端点?当我进行如下配置时,它可以工作:

location = /api/2020 {
   proxy_pass http://api/2020;
}

但是问题在于它是一个参数,因此它可以是任意数字,如何解决呢?

我已经阅读了其他文章,但我再次提出这个问题,以更广泛地了解传递参数的可能性。真的需要为此使用Regex吗?

3 个答案:

答案 0 :(得分:2)

删除完全匹配,只需使用

location /api/ {
   proxy_pass http://api/;
}

没有任何正则表达式。

答案 1 :(得分:1)

您使用的是“ =”正则表达式进行比较,因此它将找到相同的网址,因此请阅读以下代码并更改您的配置。

 location ~ ^/(api)/ {
                proxy_pass http://api;
        }

完成上述更改后,请重新启动nginx服务器,而无需为所有API编写单独的代码。

我希望! 它将解决您的问题。

答案 2 :(得分:0)

这很容易解决:

location / {
   proxy_pass http://internal_addr:port$request_uri;   
}

IP/PORT 示例:172.168.1.1:3000,内部服务器:

location / {
   proxy_pass http://172.168.1.1:3000$request_uri;   
}

通过这样做,外部客户端在 / 之后向 nginx 请求的所有内容(路由、参数等)nginx 都将以完全相同的方式转发到内部服务器。


如果你有多个内部服务器,你可以使用这样的东西:

在 server1(IP/PORT:172.168.1.1:3333)中:

location /app1 {

proxy_pass http://172.168.1.1:3333$request_uri;
}

即:

客户端对 Nginx 的请求:example.com/app1/login.php?x=y

Nginx 会将请求发送到 server1 作为 /app1/login.php?x=y

在 server2 中(IP/端口:172.168.1.2:4444):

location /app2 {

proxy_pass http://172.168.1.2:4444$request_uri;
}

即:

客户端对 Nginx 的请求:example.com/app2/login.php?x=y

Nginx 会将请求发送到 server2 作为 /app2/login.php?x=y