В настоящее время мы используем Nginx в качестве обратного прокси-сервера перед несколькими устройствами IOT для доступа к ним из-за пределов нашей внутренней сети. До сих пор я статически сопоставлял местоположение с внутренним IP-адресом каждого устройства.
Мы добавляем несколько устройств, которые используют динамический DNS в качестве http://DeviceName.ServiceName.com
но мы хотим, чтобы они появились в виде https://OurDomain.com/DeviceName/
в нашей текущей структуре каталогов вместе с другими устройствами. Этих новых устройств будет много, и я бы предпочел создать динамическое правило, которое будет брать 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 вне кода, который я опубликовал, но у меня не было проблем с проксированием наших внутренних HTTP-устройств на нашем существующем HTTPS-сайте через Nginx.
Это должно работать:
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
, то есть без последней косой черты.