当一台服务器使用多个域名时,如何获取请求中当前正在使用的域名?我在 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