Jasom Dotnet
Jasom Dotnet

Reputation: 1317

Nginx - redir only non-www to www, leave other subdomains intact (ignore subdomains)

what I try to achieve (redirecting only non-www to www - ignoring all subdomains)

example.com > https://www.example.com
example.com/query-string > https://www.example.com/query-string
http://example.com > https://www.example.com
https://example.com > https://www.example.com
es.example.com > https://es.example.com
http://es.example.com > https://es.example.com
http://es.example.com/query-string > https://es.example.com/query-string
...

My version is 1.22.1.

What I got so far:

server {
        listen 80;
        listen [::]:80;
        server_name *.example.com;
        return 301 https://$host$request_uri;
}

server {
        listen 80;
        listen [::]:80;

        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/example.com/key.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/example.com/ca.pem;
        ssl_stapling_verify on;

        server_name example.com;
        #return 301 https://www.example.com$request_uri;
        return 301 https://www.$host$request_uri;
}

server {
    server_name www.example.com;
    access_log /var/log/nginx/example.com.access.log rt_cache;
    error_log /var/log/nginx/example.com.error.log;
    root /var/www/example.com/htdocs;
    index index.php index.html index.htm;
    include ...
}

Second server block don't work. This

return 301 https://www.example.com$request_uri;

does not work because it redirs all subdomains to www (https://de.example.com > https://www.example.com)

This

return 301 https://www.$host$request_uri;

does not work even it redirs non-www do www version but in the same time it redirs all subdomains to www.subdomain (https://de.example.com > https://www.de.example.com).

I think the problem is in the server_name of the second server block. Any ideas how to solve this?

Upvotes: 0

Views: 47

Answers (1)

Aleksey Vaganov
Aleksey Vaganov

Reputation: 501

Try to use this config:

server {
       listen 80;
       server_name example.com www.example.com;

       return 301 https://www.example.com$request_uri;
}

server {
       listen 80;
       server_name "~(?<!www)\.example\.com$";

       return 301 https://$host$request_uri;
}

server {
       listen 443 ssl;
       server_name example.com;

       return 301 $scheme://www.$host$request_uri;
}

server {
       listen 443 ssl;
       server_name *.example.com;

       ...
}

Upvotes: 1

Related Questions