Nginx 重定向到 URL 中指定的端口

Nginx 重定向到 URL 中指定的端口

是否可以使用 Nginx 从这样的 URL 进行代理:

http://example.com/service/1234/foo.php?...

对于这样的内部服务:

http://example.com:1234/foo.php?...

也就是说,从 URL 中提取一个数字,并将其用作同一台服务器的端口号?

rewrite似乎仅限于操作端口后的 URL 部分,并且我认为无法proxy_pass从中访问正则表达式子字符串。

我试图解决的具体问题是让我的所有服务都可以通过端口 80 访问,因为各种企业和公共网络会阻止服务实际运行的外部端口。所以它必须是反向代理,而不是重定向。

此方法适用于单个端口:

location /service/5010 {
  rewrite ^/service/5010/(.*)$ /$1 break;
  proxy_pass http://127.0.0.1:5010;
}

但问题是如何使 5010 仅仅成为从 URL 中提取的参数。

答案1

就像是

    location / {
       set $proxy_port 8080;
       if ($uri ~ "^/service/([0-9]+)/.*$")
       {
           set $proxy_port $1;
           rewrite ^/service/[0-9]+/(.*)$ /$1 break;
       }
       proxy_pass http://127.0.0.1:$proxy_port;
    }

至少它在 Nginx 1.6.2 上对我有用

相关内容