Nginx 将带有 www 前缀的通配符子域名重定向到非 www 通配符子域名

Nginx 将带有 www 前缀的通配符子域名重定向到非 www 通配符子域名

如果您正在 提供应用程序*.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尚未与第一个块匹配。

相关内容