Nginx proxy_pass 如何传递路由参数

How does Nginx proxy_pass pass a route parameter

我正在尝试对内部 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 'parameter' 传递给 api 端点?当我进行这样的配置时它会起作用:

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

但问题是它是一个参数,所以它可能是任何数字,如何解决这个问题?

我读过其他帖子,但我再次问这个问题是为了更广泛地了解参数传递的可能性。真的有必要为此使用 Regex 吗?

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

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

上述更改后重新启动您的 nginx 服务器,您不需要为所有 API 编写单独的代码。

我希望! 它会解决你的问题。

去掉精确匹配,只用

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

没有任何正则表达式。

这很容易解决:

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将以完全相同的方式转发给内部服务器。


如果你有不止一台内部服务器,你可以使用这样的东西:

在服务器 1(IP/PORT: 172.168.1.1:3333):

location /app1 {

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

即:

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

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

在服务器 2 (IP/PORT: 172.168.1.2:4444):

location /app2 {

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

即:

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

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