web-dev-qa-db-ja.com

Nginx:httpルートとhttpsルートの両方をサブディレクトリにリダイレクトします

Nginxのhttpとhttpsの両方のルートドメインを同じサブディレクトリ(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;
    }

したがって、基本的に、ルートドメインがhttp経由で要求されているかhttps経由で要求されているかに関係なく、ルートドメインからhttps上の同じサブディレクトリにリダイレクトしようとしています。

3
Elijah Paul

この構成はあなたが望むことをします:

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のみに一致します。

7
Tero Kilkanen

いくつかの「微調整」を伴う別のアプローチ...

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

0
Eduardo Lucio

Ssl vhostのこの動作からlocationサブディレクトリを除外しないと、明らかに機能しません。

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

最後に末尾のスラッシュを追加した方法を参照してください。これは非常に重要です。そうしないと、リダイレクトループが発生します。

0
user253491