Nginx proxy_pass 从 *.local.domain.com 到 *.domain.com

Nginx proxy_pass from *.local.domain.com to *.domain.com

我有 2 个不同的 DNS 记录。一个 domain.com 指向 public 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.combar.baz.local.domain.com 应该代理到 bar.baz.domain.com

我知道我需要复制上面的服务器块。将 server_name 更改为 *.local.domain.com,但不确定如何正确设置 $not_local_host 以指向正确的子域。

最接近的类似问题是:nginx sub-subdomain wildcard, but that was in the opposite direction (and never answered), and this answer to How can i pass subdomain as proxy_pass value in nginx?,但它针对不同的域(而不是子域),而且它是一些我不明白的神奇正则表达式。谢谢。

你可以试试这个:

map $host $non_local_host {
    ~^(.*\.)?local\.domain\.com    "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;