是否可以使用 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 上对我有用