如何设置位置阻止从URL剥离端口

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

我正在尝试设置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 [email protected]
ssh -R 59595:localhost:59595 [email protected]

这按预期工作;然后我试图使它变得动态

所以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;
}

有人可以指导我正确的方法吗?谢谢!

nginx nginx-location nginx-reverse-proxy
1个回答
1
投票

根据documentation

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

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

    在这些情况下,应指定proxy_pass而不使用URI。

我认为您可以在此处尝试使用rewrite指定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;
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.