Nginx 反向代理任意目录到子域

Nginx 反向代理任意目录到子域

我们目前使用 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.comexample.com和替换ServiceName.comexample.net

我更改了server_name您的版本,因为您只有一个域用于代理虚拟服务器。

location块中,正则表达式选取规范化 URI 的第一部分,然后选取 URI 的其余部分并将其存储到变量中$path。然后在proxy_pass目标中使用。

location如果您有类似的 URL http://example.com/device,即没有最后一个斜杠字符,则可能需要调整正则表达式。

相关内容