Nginx: Redirect both http and https root to subdirectory

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.


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.