![Nginx 将带有 www 前缀的通配符子域名重定向到非 www 通配符子域名](https://linux22.com/image/736226/Nginx%20%E5%B0%86%E5%B8%A6%E6%9C%89%20www%20%E5%89%8D%E7%BC%80%E7%9A%84%E9%80%9A%E9%85%8D%E7%AC%A6%E5%AD%90%E5%9F%9F%E5%90%8D%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%E9%9D%9E%20www%20%E9%80%9A%E9%85%8D%E7%AC%A6%E5%AD%90%E5%9F%9F%E5%90%8D.png)
如果您正在 提供应用程序*.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
尚未与第一个块匹配。