4

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 ! :)

2

2 Answers 2

8

Don't use if

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

That's all ...

4
  • Wow, I didn't know it was possible to do that oO Thanks !
    – Happynoff
    May 15, 2013 at 9:18
  • ~^(www\.)?(?<domain>.+)$ will match its own redirect; remove the first question mark: ~^(www\.)(?<domain>.+)$ Mar 23, 2017 at 17:14
  • Fixed in the answer. Oct 31, 2018 at 10:14
  • So this can be used as global server block and it works... but how does one deal with SSL requests in different domains?
    – TCB13
    Jan 24, 2020 at 11:19
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 :)

2
  • 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, 2013 at 17:12
  • 1
    nginx docs kinda sucks on explaining what's going on in that if condition. nginx.org/en/docs/http/ngx_http_rewrite_module.html#if, anyway this answer helped my case.
    – lasec0203
    Mar 23, 2018 at 4:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.