web-dev-qa-db-ja.com

NginxサーバーでSSLを強制するときのリダイレクトループ

最近、Nginxを使用してHTTPSにリダイレクトしようとしていますが、ブラウザーで自分のサイトにアクセスしようとすると、リダイレクトループが発生し続けます。これが私の完全なサーバーブロック設定ファイルです:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    listen 443 ssl;

    root /var/www;
    index index.php index.html index.htm home.html contact.html projects.html;

    # Make site accessible from http://localhost/
    server_name melone.co;
    return 301  https://$Host$request_uri;
    ssl_certificate /path/to/ssl;
    ssl_certificate_key /path/to/ssl;


    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
        proxy_set_header        X-Forwarded-Proto $scheme;
    }
    error_page 404 /404.html;

        # redirect server error pages to the static page /50x.html
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        root /var/www;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

}

調べてみると、return 301 https://$Host$request_uri;がこれを行う最も簡単な方法であることがわかりました。

そこで、それを設定ファイルに実装し、Sudo service nginx restartを実行しました。次にブラウザにアクセスすると、リダイレクトループが発生しました。その1行のコードを削除すると、それはなくなりました。したがって、私が本当に探しているのは、SSLにリダイレクトするためのより効率的な方法です。

どんな助けでもいただければ幸いです。ありがとう

2
cmelone

現状では、すべてのトラフィックをhttpsにリダイレクトしています。これは、httpトラフィックには適していますが、httpsトラフィックにはまったく意味がなく、リダイレクトループが発生します。現在起こっていることは次のとおりです。http-> https-> https-> https-> https-> https ...など、ブラウザが「それで十分です。成功しません」と表示するまで、かなりの時間がかかります。

達成したいのは、httpトラフィックをhttpsにリダイレクトし、httpsトラフィックを処理することです(以前にhttpトラフィックで行ったように)。

したがって、構成を2つのserverディレクティブに分割する必要があります。1つはhttp(リダイレクトを実行する必要があります)用で、もう1つはhttps用です。トラフィック。

この例を見てください:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
    server_name melone.co;
    return 301 https://$Host$request_uri;
}

このserverブロックを構成に追加し、既存のserverブロックの対応する行を削除して、利益を得てください。

7
gf_

わかりました、問題が見つかりました。 2つのサーバーブロックが必要です。ポート80でリッスンし、443にリダイレクトします。

私はこれを私のconfの一番上に追加しました:

server {
    listen 80 ;
       server_name    melone.co;
       return         301 https://$server_name$request_uri;
}
1
cmelone