A while back, I announced that I had moved my blog over to HTTPS. What about HTTP though? Do I serve content over HTTP still, or did I doom existing links to be forever broken?

As you could guess by the title of this post, neither of those was satisfactory. Instead, I added four lines to our NGinx configuration telling it to listen on port 80 and respond to every request with a permanent redirect pointing to the same path under https://joshuarogers.net.

###Beware, Thar Be Dragons###

Before getting to the configuration, I’d like to take just a second to look at the status code we’re sending back though: 301 Moved Permanently. The keyword there is permanent. Unlike its sibling 302 Found, when we send this response back to a browser or to a crawler, it’s going to remember the response until someone clears a cache.

This also means you probably want to test this outside production. An accidental but permanent redirect is just a permanent as an intentional one. A misconfiguration here could essentially cause your site to become permanently unreachable.

TL;DR: Permanent is permanent. You don’t get to change it after the fact. Don’t test this in production.

###Configuration###

So, where were we? Ah yes, the good part. The actual configuration. In my case, I added the following lines to my site configuration file in /etc/nginx/sites-enabled/default.

server {
	listen 80 default_server;
	return 301 https://joshuarogers.net$request_uri;
}

And with that, we now are redirecting all of our existing HTTP traffic to HTTPS.