Nginx proxy_pass с *.local.domain.com на *.domain.com

У меня есть 2 разные записи DNS. Один для domain.com указывает на общедоступный IP-адрес (например, 93.184.216.34), а другой для local.domain.com указывает на локальный IP-адрес (например, 10.0.0.2) для компьютеров в той же сети.

У меня есть следующая конфигурация для proxy_pass локального поддомена в «голый» домен, который, кажется, работает:

server {
    listen 80;
    listen [::]:443 ssl;
    listen 443 ssl;
    
    # ssl config here

    server_name local.domain.com;

    location / {
        proxy_pass $scheme://127.0.0.1/;
        set $non_local_host domain.com;
        proxy_set_header Host $non_local_host;
        proxy_redirect http://$non_local_host/ http://$host/;
        proxy_redirect https://$non_local_host/ https://$host/;
    }
}

Но мне также нужны поддомены для работы. foo.local.domain.com должен проксировать на foo.domain.com, а bar.baz.local.domain.com должен проксировать на bar.baz.domain.com

Я понимаю, что мне нужно продублировать указанный выше серверный блок. Измените server_name на *.local.domain.com, но не знаете, как правильно установить $not_local_host, чтобы он указывал на правильный субдомен.

Ближайшие похожие вопросы: подстановочный знак суб-поддомена nginx, но это было в противоположном направлении (и никогда не было ответа), и этот ответ на Как передать поддомен в качестве значения proxy_pass в nginx?, но для разных доменов (а не поддоменов) и это какое-то волшебное регулярное выражение, которого я не понимаю. Спасибо.


person Jonathan Gawrych    schedule 31.10.2020    source источник


Ответы (1)


Вы можете попробовать это:

map $host $non_local_host {
    ~^(.*\.)?local\.domain\.com    "${1}domain.com";
}

server {
    listen 80;
    listen [::]:443 ssl;
    listen 443 ssl;
    
    # ssl config here

    server_name .local.domain.com;

    location / {
        proxy_pass $scheme://127.0.0.1/;
        proxy_set_header Host $non_local_host;
        proxy_redirect http://$non_local_host/ http://$host/;
        proxy_redirect https://$non_local_host/ https://$host/;
    }
}

Имя сервера .local.domain.com будет соответствовать local.domain.com и любому из его поддоменов.

Если на вашем сайте используются файлы cookie, вам также может понадобиться proxy_cookie_domain. директива:

proxy_cookie_domain $non_local_host $host;
person Ivan Shatsky    schedule 31.10.2020