2

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.

  • Please post your nginx config. Without that, we don't know what's wrong with your config – masegaloeh Sep 29 '14 at 8:18
  • Yep, sorry, am about to do that now. – Elijah Paul Sep 29 '14 at 8:22
7

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.

  • Thank you for this. I wasn't aware of the = / specifier. – Elijah Paul Sep 29 '14 at 13:55
0

Obviously it won't work if you don't exclude location subdirectory from this behaviour for the ssl vhost.

server {

    listen 80;
    server_name example.com;

    return 301 https://$server_name/subdirectory;

}

server {

    listen 443 ssl spdy;
    server_name example.com;

    location /subdirectory {
        # Your stuff
    }

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

}
0
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/;   
    }
}

See how I added the trailing slash at the end, this is very important otherwise you will get redirect loops.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.