如果您正在 提供应用程序*.example.tld
,您将如何设置它以便 http 和 https 流量www.*.example.tld
正确重定向到*.example.tld
?
当前 nginx 配置如下:
server {
listen 80;
listen [::]:80;
server_name *.example.tld;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name *.example.tld;
#ssl stuff ...
#location stuff...
}
答案1
您需要使用正则表达式server_name
来捕获前缀后面的域名部分www.
。从这个文件您会注意到通配符server_name
语句的优先级更高,这意味着它们不能很好地与正则表达式混合使用。
server
具有正则表达式语句的块的顺序server_name
很重要,因为它们会按顺序进行评估直到找到匹配项。
有多种方法可以组织这个,取决于您需要的严格程度以及此 IP 地址是否只需要处理*.example.com
。
以下示例不包含任何 SSL 配置语句。
server {
listen 80;
listen [::]:80;
listen 443 ssl;
listen [::]:443 ssl;
server_name ~^www\.(?<domain>.+)$;
return 301 https://$domain$request_uri;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
return 301 https://example.com$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name ~(^|\.)example\.com$;
#ssl stuff ...
#location stuff...
}
第一个块匹配以 开头的任何域,www.
并重定向到没有前缀的相同域www.
。
第二个块是重定向的通用http
部分https
。
第三个块可能没有必要,因为它仅匹配不是的域*.example.com
。
最后一个块匹配example.com
,并且任何以 结尾的块.example.com
尚未与第一个块匹配。