5

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.

Elijah Paul
  • 557
  • 1
  • 8
  • 19

4 Answers4

8

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.

Rafik Farhad
  • 103
  • 4
Tero Kilkanen
  • 36,796
  • 3
  • 41
  • 63
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;
    }

}
Xavier Lucas
  • 13,095
  • 2
  • 44
  • 50
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.

Jenny D
  • 27,780
  • 21
  • 75
  • 114
0

Another approach with some "tweaks"...

server {
    access_log /var/log/nginx/<DOMAIN_NAME>-access.log;
    error_log /var/log/nginx/<DOMAIN_NAME>-error.log;
    listen <PORT_PROXY>;
    server_name <DOMAIN_NAME>;

    location /<SUBDIRECTORY> {
        proxy_pass http://<RESOURCE_IP>:<RESOURCE_PORT>/<SUBDIRECTORY>;
        proxy_redirect off;
        proxy_set_header Host $host:<PORT_PROXY>;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
    }

    location = / {
        return 301 https://$server_name/<SUBDIRECTORY>;
    }

}

Thanks! =D

Eduardo Lucio
  • 269
  • 4
  • 14