Nginx 嵌入式变量 - 如何获取请求中使用的域名?

Nginx 嵌入式变量 - 如何获取请求中使用的域名?

当一台服务器使用多个域名时,如何获取请求中当前正在使用的域名?我在 Nginx 的配置文件中使用嵌入的变量。

我已经设置了 OpenSSL,并且有一个重定向,它对我的​​第一个域运行良好,因为如您所见,我在配置文件的底部明确重定向到它。因此,对任何其他域的 HTTP 请求都会重定向到第一个域以建立安全连接。是否有一个我可以使用、类似于的嵌入变量$request_uri,但只返回客户端使用的给定域名?

这是我运行重定向的服务器块。

server {
        listen 80;
        listen [::]:80;
        server_name example.com example1.com example2.com example3.com;
        location / {
                return 301 https://example.com$request_uri;
        }
}

我的其余配置如下:https://pastebin.com/HgnZ0aBe

答案1

请求中使用的域名基本上是主机请求标头。在 nginx 中,主机标头的变量是 $host。因此,如果您想根据域名/主机进行重定向,则应将配置更改为:

return 301 https://$host$request_uri;

希望这能有所帮助。谢谢

答案2

server_name variable documentation,您可以尝试使用“命名捕获组”。这可以处理子域(但不处理无子域的极端情况...):

server {
    listen 80;
    listen [::]:80;
    # Version 1: <subdomain> stops capturing at the first dot
    server_name ~ ^(?<subdomain>[^.]+)?\.(?<domain>.+)$;
    # Version 2: <subdomain> captures up to the last dot before <domain>
    # server_name ~ ^(?<subdomain>.+)?\.(?<domain>[^.]+?\.[^.]+)$;
    location / {
        return 301 https://$domain$request_uri;
    }
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    ...
    # common <domain>-specific stuff, e.g.
    ssl_certificate /etc/letsencrypt/live/$domain/fullchain.pem;
    ...

    # do something by <subdomain>, e.g. for a multisite installation
    location ^~ /sites {
        alias /var/www/sites/$domain/$subdomain/;
        ...
    }
}

也可以看看这个博客

使用 Perl 进行测试。

$ dlist="
example.com
foo.example1.com
bar.example2.com
foo.bar.example.com
"

版本 1

(无法处理第一种情况。)

$ echo "$dlist" | perl -wne 'chomp; /^(?<subdomain>[^.]+)?\.(?<domain>.+)$/ && print "subdomain: $+{subdomain}, domain: $+{domain}\n"'
subdomain: example, domain: com
subdomain: foo, domain: example1.com
subdomain: bar, domain: example2.com
subdomain: foo, domain: bar.example.com

版本 2

(与第一种情况不符。)

$ echo "$dlist" | perl -wne 'chomp; /^(?<subdomain>.+)?\.(?<domain>[^.]+?\.[^.]+)$/ && print "subdomain: $+{subdomain}, domain: $+{domain}\n"'
subdomain: foo, domain: example1.com
subdomain: bar, domain: example2.com
subdomain: foo.bar, domain: example.com

相关内容