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

2

2 Answers 2

9

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.
    – Andy Swift
    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

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .