Single Blog

How To Redirect www to Non-www with Nginx on CentOS 7

August 16, 2017, Written by 0 comment

Introduction

When you have your web site or application up and running behind a domain, it is often desirable to also allow your users access to it via the plain domain name and the www subdomain. That is, they should be able to visit your domain with or without the “www.” prefix, e.g. example.com or www.example.com, in a web browser, and be presented with the same content. While there are a variety of ways to set this up, the best solution, for consistency and SEO considerations, is to choose which domain you prefer, plain or www, and redirect the other one to the preferred domain. This type of redirect is called a Permanent Redirect, or “301 redirect”, and can be easily set up by properly configuring your DNS resource records and web server software.

This tutorial will show you how to redirect a www URL to non-www, e.g. www.example.com to example.com, with Nginx on CentOS 7. We will also show you how to redirect in the other direction, from a non-www URL to www.

If you want to perform this type of redirect with Apache as your web server, you should follow this tutorial instead.

Prerequisites

This tutorial assumes that you have superuser privileges, i.e. sudo or root, on the server that is running Nginx. If you don’t already have that set up, follow this tutorial: How to set up your new CentOS 7 server.

It is assumed that you have Nginx(httpd) installed. You can see how to do that here.

You must be able to add records to the DNS that is managing your domain.

Let’s get started by configuring your DNS records.

Configure DNS Records

In order to set up the desired redirect, www.example.com to example.com or vice versa, you must have an A record for each name.

Open whatever you use to manage your DNS. If you use 5wire services, this can be done in cPanel.

If a domain (also known as a zone) record does not already exist, create one now. The hostname should be your domain, e.g. example.com, and the IP address should be set to the public IP address of your Nginx server. This will automatically create an A record that points your domain to the IP address that you specified.

Log in to cPanel, you will see DNS Functions:

 

Go in to DNS Functions, click Edit DNS Zone.

You’ll be faced with something like this:

Locate the lines that display your www.example.com and example.com, then change their settings to IN A and point these to your IP.

Go to the bottom of the page, click save and load the changes.

Now your server should be accessible via the www and non-www-domain, but we’ll need to set up the redirect.

Configure Nginx Redirect

In order to perform the 301 redirect, you must add a new Nginx server block that points to your original server block.

Open your Nginx server block configuration in an editor. We’ll add another configuration file in the Nginx include directory, /etc/nginx/conf.d called redirect.conf:

sudo vi /etc/nginx/conf.d/redirect.conf

Your original server block should already be defined. Depending on which direction you want to redirect, use one of the following options.

Option 1: Redirect www to non-www

If you want redirect users from www to a plain, non-www domain, insert this configuration:

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

Save and exit. This configures Nginx to redirect requests to “www.example.com” to “example.com”. Note that there should be another server block that defines your non-www web server.

To put the changes into effect, restart Nginx:

sudo systemctl restart nginx

Note that if you are using HTTPS, the listen directive should be set to port 443 instead of 80.

Use this curl command to ensure that the non-www domain redirects to the www domain (replace the highlighted part with your actual domain):

curl -I http://www.example.com

You should get a 301 Moved Permanently response, that shows the non-www redirect location, like this:

HTTP/1.1 301 Moved Permanently
Server: nginx/1.4.6 (Ubuntu)
Date: Mon, 04 May 2015 18:20:19 GMT
Content-Type: text/html
Content-Length: 193
Connection: keep-alive
Location: http://example.com/

You should attempt access your domain in a web browser (www and non-www) to be sure it works.

Option 2: Redirect non-www to www

If you want redirect users from a plain, non-www domain to a www domain, add this server block:

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

Save and exit. This configures Nginx to redirect requests to “example.com” to “www.example.com”. Note that there should be another server block that defines your www web server.

To put the changes into effect, restart Nginx:

sudo systemctl restart nginx

Note that if you are using HTTPS, the listen directive should be set to port 443 instead of 80.

Use this curl command to ensure that the non-www domain redirects to the www domain (replace the highlighted part with your actual domain):

curl -I http://example.com

You should get a 301 Moved Permanently response, that shows the www redirect location, like this:

HTTP/1.1 301 Moved Permanently
Server: nginx/1.4.6 (Ubuntu)
Date: Mon, 04 May 2015 18:20:19 GMT
Content-Type: text/html
Content-Length: 193
Connection: keep-alive
Location: http://www.example.com/

You should attempt access your domain in a web browser (www and non-www) to be sure it works.

Job done!

The Nginx redirect is correctly configured, and your users will be able to access your web server via your non-www and www domain.

Ian Ensor