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


Don't use if

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

That's all ...

  • Wow, I didn't know it was possible to do that oO Thanks ! – Happynoff May 15 '13 at 9:18
  • ~^(www\.)?(?<domain>.+)$ will match its own redirect; remove the first question mark: ~^(www\.)(?<domain>.+)$ – Alexander Holmbäck Mar 23 '17 at 17:14
  • Fixed in the answer. – Andrew Swift Oct 31 '18 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 '20 at 11:19

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

  • 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. nginx.org/en/docs/http/ngx_http_rewrite_module.html#if, anyway this answer helped my case. – lasec0203 Mar 23 '18 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.