Nginx: перенаправить как http, так и https root в подкаталог

Я пытаюсь перенаправить корневой домен для http и https в nginx в один и тот же подкаталог (https):

Так, например,

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

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

Как бы мне это ни казалось простым, я изо всех сил пытаюсь этого добиться. Я пытался использовать варианты переписывания и возврата 301, но всегда получал цикл перенаправления.

Мой текущий конфиг (вызывающий цикл):

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

В общем, я пытаюсь перенаправить на тот же подкаталог по https от корневого домена, независимо от того, запрашивается ли корневой домен через http или https.

3 ответа

Решение

Эта конфигурация будет делать то, что вы хотите:

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

= / спецификаторы означают полное совпадение, поэтому оно соответствует только точному корневому URI виртуального сервера.

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

Посмотрите, как я добавил косую черту в конце, это очень важно, иначе вы получите петли перенаправления.

Очевидно, что это не сработает, если вы не исключите подкаталог location из этого поведения для 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;
    }

}

Другой подход с некоторыми "хитростями"...

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

}

Благодаря! =D

Другие вопросы по тегам