Nginx 如何设置位置块从url中剥离端口

Nginx 如何设置位置块从url中剥离端口,nginx,nginx-location,nginx-reverse-proxy,Nginx,Nginx Location,Nginx Reverse Proxy,我正在尝试设置nginx,以便根据路径中找到的端口动态地将代理反转到端口 所以https://my-nginx.uksouth.cloudapp.azure.com/58585/some/route转到https://localhost:58585/some/route 和https://my-nginx.uksouth.cloudapp.azure.com/59595/some/route转到 https://localhost:59595/some/route 我可以像这样硬编码配置 ser

我正在尝试设置nginx,以便根据路径中找到的端口动态地将代理反转到端口

所以
https://my-nginx.uksouth.cloudapp.azure.com/58585/some/route
转到
https://localhost:58585/some/route

https://my-nginx.uksouth.cloudapp.azure.com/59595/some/route
转到
https://localhost:59595/some/route

我可以像这样硬编码配置

server {
  server_tokens off;
  server_name my-nginx.uksouth.cloudapp.azure.com;

  listen [::]:443 ssl ipv6only=on; # managed by Certbot
  listen 443 ssl; # managed by Certbot
  ssl_certificate /etc/letsencrypt/live/my-nginx.uksouth.cloudapp.azure.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/my-nginx.uksouth.cloudapp.azure.com/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

  location /58585 {
    proxy_pass http://localhost:58585/;

    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 https;
    proxy_redirect off;
  }

  location /59595 {
    proxy_pass http://localhost:59595/;

    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 https;
    proxy_redirect off;
  }

}

server {
  if ($host = my-nginx.uksouth.cloudapp.azure.com) {
    return 301 https://$host$request_uri;
  } # managed by Certbot

  listen 80 default_server;
  listen [::]:80 default_server;

  server_name my-nginx.uksouth.cloudapp.azure.com;

  return 404; # managed by Certbot
}
像这样的反向代理

ssh -R 58585:localhost:58585 myuser@my-nginx.uksouth.cloudapp.azure.com
ssh -R 59595:localhost:59595 myuser@my-nginx.uksouth.cloudapp.azure.com
这是意料之中的事;然后我试着让它充满活力

所以
https://my-nginx.uksouth.cloudapp.azure.com/targetPort/some/route
转到
https://localhost:$targetPort/some/route

我能想到的最好的办法是以下几点,但这一点一直在失败,并且有一个502坏网关

location ~ /([0-9]+) {
    set $targetPort $1;
    proxy_pass http://localhost:$targetPort/;

    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 https;
    proxy_redirect off;
}
有人能给我指点正确的方法吗? 谢谢

根据:

在某些情况下,无法确定要替换的请求URI部分:

  • 使用正则表达式指定位置时,以及在命名位置内

    在这些情况下,
    proxy\u pass
    应该在没有URI的情况下指定

我认为您可以尝试在此处使用
重写
来指定URI:

location ~ ^/(\d+) {
    set $targetPort $1;
    rewrite /\d+(.*) $1 break;
    proxy_pass http://localhost:$targetPort;
    ...
}
也许可以针对一个正则表达式匹配而不是两个正则表达式匹配进行优化:

location ~ ^/(\d+)(.*) {
    set $targetPort $1;
    set $newuri $2;
    rewrite . $newuri break;
    proxy_pass http://localhost:$targetPort;
    ...
}
但它需要测试,nginx的行为有时是不可预测的

更新

这是绝对可以优化的

location ~ ^/(?<targetPort>\d+)(?<newURI>.*) {
    rewrite . $newURI break;
    proxy_pass http://localhost:$targetPort;
    ...
}
位置~^/(?\d+(.*)){
重写。$newURI break;
代理通行证http://localhost:$targetPort;
...
}

在我添加回我原来的硬编码位置块之前,我担心这不起作用,但有趣的是,我在regex位置块中添加了一个额外的头,并在响应中返回(当我包含硬编码uri时)这意味着它使用了regex位置块。例如,此版本不起作用。eg2此版本起作用,但在响应头中包含
X-debugmsg:regex5959595
,可能与Certbot管理的额外ssl配置有关,导致了问题