5

I have a server config in nginx which matches several domains:

server {
  server_name example1.com example2.com example3.com;
  # ...
}

And I would like to redirect the www versions to the corresponding domains. I know how to do it for a single domain with a redirect and I would know how to do the inverse thing but I can't find a way here.

Any idea ?

Thanks ! :)

Happynoff
  • 193
  • 1
  • 6
  • 1
    Be very careful. [You probably want to do the opposite.](http://serverfault.com/q/145777/126632) Especially if you ever have aspirations of your sites being large. – Michael Hampton May 13 '13 at 15:34
  • I know that but sadly it's not my call :( Thanks for the link though :) – Happynoff May 15 '13 at 09:19

2 Answers2

9

Don't use if

server {
    server_name ~^(www\.)(?<domain>.+)$;
    return 301 $scheme://$domain$request_uri;    
}

That's all ...

cadmi
  • 7,308
  • 1
  • 17
  • 23
4

Ok I found this solution:

server {
  server_name www.exemple1.com www.example2.com www.exemple3.com;
  listen 80;

  if ($http_host ~ "www\.(.*)") { #Note the extra "\" after the www
    return 301 $scheme://$1$request_uri;
  }
}

It works like a charm :)

aliqandil
  • 123
  • 5
Happynoff
  • 193
  • 1
  • 6
  • I would actually set up separate server blocks for each domain name. Using IF is generally bad and really non-performant with NGINX. – probablyup May 13 '13 at 17:12
  • 1
    nginx docs kinda sucks on explaining what's going on in that if condition. http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if, anyway this answer helped my case. – lasec0203 Mar 23 '18 at 04:44