Nginx Remove WWW And Respond To Both

17,279

Solution 1

On the first question - simply add both domains:

server_name mydomain.io www.mydomain.io;

For the second, you'll need this simple redirect:

server {
      listen 80;

      server_name www.mydomain.io mydomain.io;

      if ($host = 'www.mydomain.io' ) {
         rewrite  ^/(.*)$  http://mydomain.io/$1  permanent;
      }

Solution 2

According to https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#server-name-if, you should use:

server {
  server_name www.example.com;
  return 301 $scheme://example.com$request_uri;
}
server {
  server_name example.com;
  # [...]
}

Solution 3

I believe it's better to add two seperate server blocks to avoid unnecessary checking by the if block. I also use the $scheme variable so that HTTPS requests will not be redirected to their insecure counterparts.

server {
    listen 80;

    server_name www.mydomain.io;

    rewrite ^ $scheme://mydomain.io$uri permanent;
}

server {
    listen 80;

    server_name mydomain.io;

    # your normal server block definitions here
}

Solution 4

For a generic approach, without having to mention any specific domain or protocol, I have used this quite successfully:

  # rewrite to remove www.
  if ( $host ~ ^www\.(.+)$ ) {
    set $without_www $1;
    rewrite ^ $scheme://$without_www$uri permanent;
  }

This will redirect: https://www.api.example.com/person/123?q=45 to https://api.example.com/person/123?q=45

Solution 5

Another way to code it :

if ($http_host ~* "^www\.(.+)$"){
    rewrite ^(.*)$ http://%1$request_uri redirect;
}

It works even with multiple domain names on the same code.

Share:
17,279
Justin
Author by

Justin

Updated on July 30, 2022

Comments

  • Justin
    Justin almost 2 years

    I have the following nginx configuration fragment:

    server {
       listen 80;
    
       server_name mydomain.io;
    
       root /srv/www/domains/mydomain.io;
    
       index index.html index.php;
    
       access_log /var/log/nginx/domains/mydomain.io/access.log;
       error_log /var/log/nginx/domains/mydomain.io/error.log;
    
       location ~\.php {
          try_files $uri =404;
          fastcgi_index index.php;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_intercept_errors on;
          fastcgi_pass 127.0.0.1:9000;
          include /etc/nginx/fastcgi_params;
       }
    }
    

    First, how can I make the server block respond to both http://www.mydomain.io and also http://mydomain.io. Second, I want to force if they come from http://www.mydomain.io to redirect to http://mydomain.io.

    Thanks.