nginx从uri中捕获端口号并设置proxy_pass

问题描述 投票:0回答:1

按照这篇文章,我可以成功手动加载端口。例如,使用以下 nginx.conf:

location /port { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_pass http://localhost:5001; }
如果我想重定向和端口范围 (5001-5228),我必须手动创建位置。为了避免这种情况,我想使用正则表达式方法捕获端口号。
我尝试的是以下:

location ~^/port/(.*)$ { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_pass http://localhost:$1; add_header X-debug-message "input: $1" always; add_header X-debug-message-2 "request_uri: $request_uri" always; add_header X-uri "uri: $uri" always; }
我从这个实现中得到的响应标头是:

Content-Type: text/html Server: nginx/1.17.3 X-Debug-Message: input: 5002 X-Debug-Message-2: request_uri: /port/5002 X-Uri: uri: /port/5002


Nginx 日志显示:

error 4512#4512: \*1 no resolver defined to resolve localhost


关注

这篇文章 我将解析器设置为 0.0.0.0、127.0.0.1 以及 /etc/resolv.conf 显示的内容 但要么不返回解析器,要么 *1 localhost could not be resolved (110: Operation timed out)


我也尝试过使用以下选项

location ~^/port/(.*)$ /{ ... rewrite /port/(.\*) $1 break; set $upstream http://localhost:$1; proxy_pass $upstream; }
返回:

Content-Type: text/html Server: nginx/1.17.3 X-Debug-Message: input: 5002 X-Debug-Message-2: request_uri: /port/5002 X-Uri: uri: 5002


Nginx 日志显示:

error 4638#4638: \*5 invalid URL prefix in ""


如何设置 nginx.conf 位置块,以便使用 /port/50xx 的调用将被重定向到具有端口的本地主机? 预先感谢!

nginx nginx-reverse-proxy nginx-config
1个回答
0
投票
回答我自己的问题。为其他遇到类似问题的人保持开放。 我最终使用了以下内容:

location ~^/port/(?<port>\d+)/(.*)$ { resolver 127.0.0.1; set $upstream "http://127.0.0.1:$port"; proxy_pass $upstream/$2$is_args$args; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
我学到的东西是通过位置 

(?<port>\d+)

 分配 $port 变量,并使用你的 uri 创建一个后端字符串。然后代理传递该后端变量。通过将解析器移动到位置块中解决了解析器问题。

© www.soinside.com 2019 - 2024. All rights reserved.