是否有可能使用Nginx从这样的URL代理:
http://example.com/service/1234/foo.php?...
到像这样的内部服务:
http://example.com:1234/foo.php?...
也就是说,从URL中提取一个数字,并将其作为端口号使用到同一台服务器上?
rewrite似乎仅限于操作端口后的URL部分,我不认为proxy_pass可以从中访问正则expression式的子string。
我试图解决的具体问题是,我的服务都可以在端口80上访问,因为各种公司和公共networking阻塞了实际运行服务的异国情调的端口。 所以它必须是一个反向代理,而不是一个redirect。
此方法适用于单个端口:
location /service/5010 { rewrite ^/service/5010/(.*)$ /$1 break; proxy_pass http://127.0.0.1:5010; }
但问题是如何使5010只是从URL中提取的参数。
就像是
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; }
至less它在Nginx 1.6.2上适合我