我们目前使用 Nginx 作为多个物联网设备前端的反向代理,以便从内部网络外部访问它们。到目前为止,我已经将位置静态映射到每个设备的内部 IP 地址。
我们正在添加几个使用动态 DNS 的设备,http://DeviceName.ServiceName.com
但我们希望它们以 的形式出现https://OurDomain.com/DeviceName/
在我们当前的目录结构中,与其他设备并列。这些新设备将会很多,我宁愿制定一个动态规则,从 URL 中获取设备名称,并将请求发送到正确的设备。
如何从 URL 设置一个变量,并将其重写到我的 proxy_pass 中,这样我就不会结束将请求发送到http://DeviceName.ServiceName.com/DeviceName/
我正在尝试遵循以下格式https://chrismarslender.com/2014/07/21/url-based-variables-nginx/我已经尝试过了:
server {
listen 80;
server_name OurDomain.com./(?P<DeviceName>)$;
root /var/www/html/
location / {
proxy_pass http://$DeviceName.ServiceName.com;
}
我在发布的代码中删除了 HTTPS 内容,但是通过 Nginx 代理我们现有 HTTPS 站点上的内部 HTTP 设备并没有遇到任何问题。
答案1
这个应该可以工作:
server {
listen 80;
server_name example.com;
root /var/www/html/;
location ~ ^/(?:[^/]+)/(?P<path>.+)$ {
proxy_pass http://$DeviceName.example.net/$path;
}
}
我ourdomain.com
用example.com
和替换ServiceName.com
了example.net
。
我更改了server_name
您的版本,因为您只有一个域用于代理虚拟服务器。
在location
块中,正则表达式选取规范化 URI 的第一部分,然后选取 URI 的其余部分并将其存储到变量中$path
。然后在proxy_pass
目标中使用。
location
如果您有类似的 URL http://example.com/device
,即没有最后一个斜杠字符,则可能需要调整正则表达式。