Nginx 将所有域名重定向到 www 子域名

Nginx 将所有域名重定向到 www 子域名

我有一个 nginx 配置,它可以按照我的一个域的预期工作,但是每当我将另一个域指向我的服务器时,就会出现奇怪的重定向行为。

问题:
我想将所有对非 www 的请求重定向到我的网站的 www 版本。

例如:
http://example.com应该重定向到https://www.example.com
http://m.example.com应该重定向到https://www.example.com

我的配置在 example.com 上按预期工作,但每当我使用单独的配置文件将 cname 设置为我的服务器 ip 时,都会将 cdn.test.com 重定向到 www.cdn.test.com

这是我的 example.com 的配置:

    server{
        #redirect non-www to www
        listen 80;
        listen 443 ssl;
        server_name example.com;

        ssl_certificate .../cert.pem;
        ssl_certificate_key .../key.pem;   
        return 301 https://www.$host$request_uri;
    }


    server{
        #redirect request to the mobile site to the main site
        listen 80;
        server_name m.example.com;
        return 301 https://www.example.com$request_uri;
    }
    server{
        #redirect unsecure www to secure wwww
        listen 80;
        server_name www.example.com;
        return 301 https://$host$request_uri;
    }
    upstream backend {
        server 127.0.0.1:23042;
        server 127.0.0.1:23043 backup;   
     }
    server {
        listen 443 ssl;
        server_name www.example.com;

        access_log off;
        error_log off;

        ssl_certificate .../cert.pem;
        ssl_certificate_key .../key.pem;   

        location / {
            proxy_pass http://backend;
            proxy_redirect off;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header CF-IPCountry $http_cf_ipcountry;
        }

        location /static {
            alias .../app/static;
            expires 30d;
        }
    }

这是 cdn.test.com 的配置:

    server {
      listen 80;
      server_name cdn.test.com;
       root /home/.../files;
    }

答案1

在您的配置中第一个server块是默认服务器 它将用于所有与更具体的服务器不匹配的请求。

不要return 301 https://www.$host$request_uri;在 default_server 中使用请求中的 Host 标头作为参数来生成重定向,因为这可能会出现各种错误,而是return 301 https://www.example.com$request_uri;始终重定向到 www.example.com

答案2

你可以像我一样设置

 server {
#redirect all naked domains to https and www
        if ($host = aihello.com) {
            return 301 https://www.aihello.com$request_uri;
        } 
    
    
#redirect all unsecure www to secure www
        if ($host = www.aihello.com) {
            return 301 https://www.aihello.com$request_uri;
        } 
    
    
    server_name aihello.com www.aihello.com default_server;
    
    
        listen [::]:80 ipv6only=on;
        listen 80 ;
        return 404; 
    
    
    
    
    }

相关内容