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

up vote 5 down vote accepted

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 at 10:14

Ok I found this solution:

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

  if ($http_host ~ "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 at 4:44

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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