如何让 dev.*.domain.com 在 nginx 上运行

如何让 dev.*.domain.com 在 nginx 上运行

我正在尝试让 nginx 接受这种格式的网站:dev.*.domain.com。我已阅读文档,并且我明白我必须为此使用正则表达式。

通配符名称只能在名称的开头或结尾处包含星号,并且只能在点边框上包含星号。名称“www..example.org” 和 “w.example.org” 是无效的。但是,可以使用正则表达式指定这些名称,例如“~^www..+.example.org$”和“~^w..example.org$”。星号可以匹配多个名称部分。名称“.example.org” 不仅匹配 www.example.org,还匹配 www.sub.example.org。

所以我有:

server {
        listen 80;
        server_name ~^dev\..+\.domain\.com\.br$ dev.domain.com.br;

        access_log /var/log/nginx/dev.domain.com.br.access.log;
        error_log /var/log/nginx/dev.domain.com.br.error.log;

        location / {
            proxy_pass http://127.0.0.1:68319/;
            include /etc/nginx/proxy.conf;
        }
        location /media/ {
            alias /my/folder/to/media/;
            expires 15d;
        }
        location /favicon.ico { 
            alias /my/folder/to/favicon.ico;
            expires 15d;
        }
    }

不知何故,它最终被这条规则(最后一条)所捕获:

server {
        listen 80;
        server_name *.domain.com.br domain.com.br;

        access_log /var/log/nginx/domain.com.br.access.log;
        error_log /var/log/nginx/domain.com.br.error.log;

        location / {
            proxy_pass http://127.0.0.1:8080/;
            include /etc/nginx/proxy.conf;
        }
        location /media/ {
            alias /my/path/to/media/;
            expires 15d;
        }
        location /favicon.ico { 
            alias /my/path/to/favicon.ico;
            expires 15d;
        }
    }

有什么想法吗?提前致谢。

PS:我认为它被 *.domain.com 捕获是因为 nginx 测试匹配的顺序。我能否重写 *.domain.com 以仅测试 1 个子域级别?即 test.domain.com 与 *.domain.com 匹配,但 sub.test.domain.com 不匹配。

答案1

*.domain.com 只是一个简单的后缀匹配,无法将其限制在单个子域级别。要实现您想要的效果,您必须将后缀检查转换为正则表达式:

server {
  server_name ~^dev\..+\.domain\.com\.br$ dev.domain.com.br;
  ...
}

server {
  server_name ~^[^.]+\.domain\.com\.br$ domain.com.br;
  ...
}

由于两个检查都是正则表达式,所以服务器块的顺序很重要。

相关内容