Nginx: Redirect both http and https root to subdirectory

301-redirectnginxreverse-proxy

I'm attempting to redirect the root domain for both http and https in nginx to the same subdirectory (https):

So e.g.

http://example.com -> https://example.com/subdirectory

https://example.com -> https://example.com/subdirectory

As simple as this seemed to me, I'm struggling to achieve this. I've tried using variations of rewrites and return 301, but always end up with a redirect loop.

My current config (causing the loop):

server {
        listen      80;
        server_name example.com;
        return 301 https://$server_name/subdirectory;
        }
server {
        listen 443 ssl spdy;
        server_name example.com;
        return 301 https://$server_name/subdirectory;
    }

So basically, i'm trying to redirect to the same subdirectory on https from the root domain, whether the root domain is requested via http or https.

Best Answer

This configuration will do what you want:

server {
    listen 80;
    server_name example.com;

    return 301 https://$server_name/subdirectory;
}

server {
    listen 443;
    server_name example.com;

    location = / {
        return 301 https://$server_name/subdirectory;
    }
}

The = / specifiers means a full match, so it matches only the exact root URI of the virtual server.