Nginx - 将非 www 重定向到 www,但不重定向子域名

Nginx - 将非 www 重定向到 www,但不重定向子域名

我有许多域名链接到同一个 php 目录,我需要将它们全部从非 www、非 https 重定向到 www、https。

    # Add www, if missing
    server {
            server_name "~^(?!www\.).*";
            listen 80;
            listen 443 ssl;
            ssl_certificate /etc/nginx/ssl/zipy_co_il_new.pem;
            ssl_certificate_key /etc/nginx/ssl/zipy_co_il_new.key;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            rewrite ^/(.*) https://www.$host/$1 permanent;
    }

    # Redirect to https
    server {
            server_name "~^(www\.).*";
            listen 80;

            rewrite ^/(.*) https://$host/$1 permanent;
    }

    # Redirect to https
    server {
            server_name 144.76.173.84;
            listen 80;

            rewrite ^/(.*) https://$host/$1 permanent;
    }

    # Site description
    server {
            server_name "~^(www\.).*";
            listen 443 ssl;
            ssl_certificate /etc/nginx/ssl/zipy_co_il_new.pem;
            ssl_certificate_key /etc/nginx/ssl/zipy_co_il_new.key;
            ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
            set $root_path /var/www/<path..>

这个工作正常,但现在我必须向我的域名添加一个子域名,并且我不希望子域名重定向到 www,但希望重定向到 https,所以我尝试将第三行更改为(对于 m.子域名)

server_name "~^(?!www\.)(?!m\.).*";

但它仍将 m. 重定向至 www.m.

答案1

您已检查每个不以 开头的请求是否www被重定向并获得额外的www。由于m.example.org不以 开头,www因此将添加前缀。

您可以通过多种方式解决这个问题,但为了与您的方法保持一致,让我们改进正则表达式

server_name "~^([^.]*\.[^.]*)$";

因此,如果服务器名称由两部分组成(即裸域),则在其前面加上www。如果它使用子域,则只需按原样提供服务即可。不幸的是,这仅适用于 .com 或 .org 等简单域。但对于 .co.uk 之类的域名,它将失败。

在这种情况下,我们需要将实际的顶级域名指定为正则表达式的一部分:

server_name "~^([^.]*\.(co\.uk|net|org|com))$";

这会将所有裸域名移至www。子域名将保持不变。

相关内容