FeaturesWP CloudPricingEE CLIContactMy Account

Features

Team Access & User Permissions

Server Setup & Management

Site Creation & Management

Deployments & Developer Tools

Firewall Protection

Speed & Caching

Backups & Recovery

Logs & Monitoring

Create WP Cloud Sites

All Features

Read Documentation

Install

Installation Guide

FAQ

Roadmap

Explore EE CLI

Resources

Commands

Handbook

Blog

Community

Forum

EasyExperts

Tutorials

Subscribe

Github

CLEAR

Start For Free

separator Tutorials separator Nginx separator Nginx config for www to non-www and non-www to www redirection

Topics

On this page

Redirect non-www to WWW

Single domain

All domains

From WWW to non-WWW

Single domain

All domains

Nginx config for www to non-www and non-www to www redirection

There are many ways to force Nginx to use either WWW version or non-WWW version of URLs for your site.

We use following codes all the time.

Redirect non-www to WWW

Single domain


			server {
        server_name example.com;
        return 301 $scheme://www.example.com$request_uri;
}
		

All domains


			server {
        server_name "~^(?!www\.).*" ;
        return 301 $scheme://www.$host$request_uri;
}
		

From WWW to non-WWW

Single domain


			server {
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}
		

All domains


			server {
         server_name "~^www\.(.*)$" ;
         return 301 $scheme://$1$request_uri ;
}
		

In both cases, for other-www, we create a altogether different server { } block. IMHO, this is cleanest and optimised way to handle www to non-www and non-www to www redirection.

There are some WordPress plugins available there which can handle this at PHP-level. But for performance reason, always handle things in Nginx, that can be handled in Nginx alone! 😉

Debugging Nginx Configuration

PREVIOUS

Optimizing Nginx Configuration

NEXT


Comments

  1. Mitesh Shah Avatar

    Mitesh Shah

    July 25, 2013

    Instead of hardcodes http we can use $scheme

    OLD:
    return 301 External link to example.com$request_urihttp://example.com$request_uri;

    New:
    return 301 $scheme://example.com$request_uri;

  2. Hardy Sam Avatar

    Hardy Sam

    October 24, 2013

    Is it true that www if not redirected permanently to non-www, will hurt site ranking and Google would see it as duplicate contents?

    1. Rahul Bansal Avatar

      Rahul Bansal

      October 25, 2013

      I am not sure about Google but technically serving same page on www and non-www (root) domain should be considered duplicate.

  3. rizky Avatar

    rizky

    November 3, 2013

    hello thanks for the guide, im using redirect non to www
    the code “for all domain” works for me but the single domain code is not work

    1. Rahul Bansal Avatar

      Rahul Bansal

      November 5, 2013

      Please send your config for single domain via pastebin. Most likely your server_name directive is wrong.

  4. Dr.Phunk Avatar

    Dr.Phunk

    November 12, 2013

    Can you tell me what’s the difference here between single and all domain.
    If I need to strip www from even all the subdirectories then what shall be used ?

  5. Dr.Phunk Avatar

    Dr.Phunk

    November 12, 2013

    Actually, I am an apache user and very new to nginx so please tell me where to save these codes under which directory and with what file name and file type?
    As there is nothing like .htaccess for nginx

  6. Sameer Joshi Avatar

    Sameer Joshi

    November 13, 2013

    The single domain config will add a redirection only to a specific domain that you have mentioned in the configuration. Hence, the config in the post has example.com domain which you can replace with the specific single domain.

    The All domains config will add it to all the domains for which requests are made on the server.

    These config will be added to your Nginx configuration file. It will typically be under

    /etc/nginx/sites-available/example.com
    

    Once you add the rule test your nginx configuration by

    nginx -t
    

    If the test is passed then reload the Nginx process by

    service nginx reload
    
  7. Mardix Avatar

    Mardix

    December 29, 2013

    I don’t know if it’s a typo or something, but for me, to redirect WWW to Non-WWW I had to flip your code this way:

    server {
    server_name “~^www\.(.*)$” ;
    return 301 $scheme://$1$request_uri;
    }

    1. Rahul Bansal Avatar

      Rahul Bansal

      December 30, 2013

      Looks like I forgot quotes. Updated article. Thanks.

  8. Ana Avatar

    Ana

    January 17, 2014

    Its not working for me. I tried many options of putting server {
    server_name “~^(?!www\.).*” ;
    return 301 $scheme://www.$host$request_uri;
    }
    but nothing works for me.
    Here is my sites available file External link to pastebin.comhttp://pastebin.com/aTy9xtca

    1. Rahul Bansal Avatar

      Rahul Bansal

      January 18, 2014

      I think above 2 lines are losing precedence to *.bestdocumentariesonline.com
      Reference: External link to nginx.orghttp://nginx.org/en/docs/http/server_names.html

      In that case you can try adding a line like below index line inside server {..} block

      if ( $http_host ~* "www\.(.*)") {
                       rewrite ^ http://$1$request_uri permanent;
      }
      

      Please be careful about first line as I am writing it without tasting.

      1. Ana Avatar

        Ana

        January 18, 2014

        Thanks Rahul but nothing works for me:(. I added your line and same, also I added this line server {
        server_name “~^(?!www\.).*” ;
        return 301 $scheme://www.$host$request_uri;
        } also in nginx.conf file so also isnt working (basically I try all these lines on different positions and same again. when without www it shows all ok when with www Server not found. Maybe problem in this that my External link to www.mysite.comhttp://www.mysite.com was never reachable? Maybe I should do something to bring this www to live site and then to redirect. ?

      2. Ana Avatar

        Ana

        January 19, 2014

        Thanks Rahul but not success. I added this line and I was trying with different lines different positions and even different files f.e. ngnix.conf (where I should exactly add this line?)
        I think that problem can be because my www never was reachable . Maybe I should do something to make it reachable and to point to my site and then to redirect?

        1. Rahul Bansal Avatar

          Rahul Bansal

          January 22, 2014

          Sorry for delayed reply. At this point, I won’t be able to debug further via comments only.

          You need to make sure:

          1. For all desired domains, DNS lookup reaches to your server’s IP.
          2. Nginx server_name block as wildcard e.g. *.example.com and/or listening by default on that IP. “listening by default” is recommended for domain-mapping.
          3. You need to use rules like I posted in previous comment “if server_name starts with www, regex to fetch domain/hostname without www and redirect to it”

          There are few more ways and tricks but its not possible for me to debug it like this. You can give it a try, or may hire somebody as a last resort.

          1. Ana Avatar

            Ana

            January 24, 2014

            Thanks Rahul. You idea brought me to solve this issue with redirection.
            Only I don’t know if I did it right way (to not have further problems).
            What I did: I added 2 CNAME records in my dns:
            CNAME * @
            CNAME www @
            and also your line for this article and all is redirecting now properly.
            What o you think is this all correct way as I newer heard for www line before.
            Cheers!

          2. Rahul Bansal Avatar

            Rahul Bansal

            January 24, 2014

            You don’t need CNAME record for WWW. It will be covered by wildcard record in your case.

  9. Alexander Avatar

    Alexander

    January 18, 2014

    Putting it in to nginx.conf inside http { } but it’s not working.

    1. Rahul Bansal Avatar

      Rahul Bansal

      January 18, 2014

      What error did you get?

  10. Alexander Avatar

    Alexander

    January 18, 2014

    No error, it just not redirecting from www to non-www. Using nginx as reverse proxy with apache.

    1. Rahul Bansal Avatar

      Rahul Bansal

      January 18, 2014

      Why are you using Apache? I think you haven’t followed our setup so I am not sure what problems you are facing.

      If you can start afresh, try using easyengine – External link to rtcamp.comhttp://rtcamp.com/easyengine

  11. Fahad Avatar

    Fahad

    January 25, 2014

    I am very impress with your all article.

    Please guide how do we enable functionality for External link to www.subdomains.domain.comhttp://www.subdomains.domain.com where subdomains list come from database namse is subdomain.php . i tried following which is not working

    server { listen 80; server_name www.domain.com *.domain.com; ............

    **if ($http_host !~ "^(www\.)?domain\.com"){ rewrite !^subdomain\.php$ /subdomain.php break; }**

    location / { root /usr/share/nginx/html/domain.com/; index index.php; .......

    1. Rahul Bansal Avatar

      Rahul Bansal

      January 27, 2014

      Sorry, I couldn’t understand your problem properly.

      1. Fahad Avatar

        Fahad

        January 27, 2014

        When client do visit at rahul.mydomain.com

        First it will auto redirect at External link to www.rahul.mydomain.comhttp://www.rahul.mydomain.com and check rahul name my db by using php code “subdomains.php”

        & get the all profile page

        like External link to www.rahul.mydoamin.comhttp://www.rahul.mydoamin.com/index.
        like External link to www.rahul.mydoamin.comhttp://www.rahul.mydoamin.com/profile.
        like External link to www.rahul.mydoamin.comhttp://www.rahul.mydoamin.com/contect.

        i tried followings on Nginx

        if ($http_host !~ “^(www.)?domain.com”){
        rewrite !^subdomain.php$ /subdomain.php break;
        }

        Please Help

        1. Rahul Bansal Avatar

          Rahul Bansal

          January 29, 2014

          I assume rahul from www.rahul.mydomain.com will be passed to subdomain.php as an argument.

          Something like: subdomain.php?domain=rahul

          If that is the case, you need to change regex to something like: (please note first line)

          if ($http_host !~ "^(www.)?([^\.]*)\.domain.com"){
              try_files /subdomain.php?domain=$2 =404;
          }
          

          I am assuming subdomain.php is present in root.

          I think you don’t need rewrite. You just need to tell nginx to use subdomain.php in a particular case (with may be some arguments)

  12. Chirag Avatar

    Chirag

    February 13, 2014

    I would like to redirect one page on my site to homepage. Without affecting sub-pages..

    like redirecting site.com/abc to site.com without getting redirect loop in site.com/abc/xyz

    How can that be done? I read about modifying conf file in /etc/nginx… but in my case there is no nginx directory within etc.

    1. Rahul Bansal Avatar

      Rahul Bansal

      February 14, 2014

      In site.com server block, add rewrite ^/abc$ http://site.com/abc/xyz last;

      ^ and $ will make sure no redirect loop starts.

Features

Useful Links

Product

Other Products

Subscribe for curated product updates, tips, and announcements.

"*" indicates required fields

URL

This field is for validation purposes and should be left unchanged.

Email*

SIGN ME UP

Δ


© rtCamp, since 2009. All rights reserved.

Powered by