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

j1dl9f46  于 2024-01-06  发布在  Nginx
关注(0)|答案(1)|浏览(167)

遵循this post我可以成功地手动加载端口。例如,使用以下nginx.conf:

  1. location /port {
  2. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  3. proxy_set_header X-Forwarded-Proto $scheme;
  4. proxy_set_header Host $http_host;
  5. proxy_pass http://localhost:5001;
  6. }

字符串
如果我想重定向和端口范围(5001-5228),我必须手动创建位置。为了避免这种情况,我想使用正则表达式方法捕获端口号。我尝试了以下方法:

  1. location ~^/port/(.*)$ {
  2. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  3. proxy_set_header X-Forwarded-Proto $scheme;
  4. proxy_set_header Host $http_host;
  5. proxy_pass http://localhost:$1;
  6. add_header X-debug-message "input: $1" always;
  7. add_header X-debug-message-2 "request_uri: $request_uri" always;
  8. add_header X-uri "uri: $uri" always;
  9. }


我从这个实现中得到的响应头是: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
this post之后,我将解析器设置为0.0.0.0、127.0.0.1和/etc/resolv.conf显示的内容,但要么不返回解析器,要么返回*1 localhost could not be resolved (110: Operation timed out)
我还尝试了以下选项内

  1. location ~^/port/(.*)$ /{
  2. ...
  3. rewrite /port/(.\*) $1 break;
  4. set $upstream http://localhost:$1;
  5. proxy_pass $upstream;
  6. }


返回: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/50 xx的调用将被重定向到带有port的localhost?提前感谢!

ego6inou

ego6inou1#

回答我自己的问题。为其他遇到类似问题的人保持开放。我最终使用了以下内容:

  1. location ~^/port/(?<port>\d+)/(.*)$ {
  2. resolver 127.0.0.1;
  3. set $upstream "http://127.0.0.1:$port";
  4. proxy_pass $upstream/$2$is_args$args;
  5. proxy_set_header Host $http_host;
  6. proxy_set_header X-Real-IP $remote_addr;
  7. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  8. proxy_set_header X-Forwarded-Proto $scheme;
  9. }

字符串
我学到的是通过位置(?<port>\d+)分配$port变量,并使用uri创建一个后端字符串。然后代理传递该后端变量。通过将解析器移动到位置块中,解决了解析器问题。

相关问题