web-dev-qa-db-ja.com

NGINX HTTP / NON-WWWからHTTPSへのリダイレクトが多すぎる

別のスレッドで見つけた次の設定を受け入れられた回答として使用して、httpsとwww以外のすべてをhttps://www.example.comに301リダイレクトしたい。しかし、それは私のために働いていません。

機能するもの:

  • https://example.com-> https://www.example.com

  • http://example.com-> https://www.example.com

しかし...

  • http://www.example.com-> TOO MANY REDIRECTS ... curlを使用すると、常に自分自身にリダイレクトされることがわかります...

これが私のnginx.confです:

server {

    # ports
    listen 80;
    listen [::]:80;

    # domain name
    server_name example.com www.example.com;

    # Redirect all non-https requests
    rewrite ^ https://www.example.com$request_uri? permanent;
}

server {

    if ($bad_referer) {
        return 444;
    }

    if ($bad_bot) {
        return 444;
    }

    # ports
    listen [::]:443 ssl http2;
    listen 443 ssl http2;

    # domain name
    server_name example.com www.example.com;

    if ($Host = 'example.com') {
      return 301 https://www.example.com$request_uri;
    }

    # ssl certificate files
    ssl_certificate /etc/ssl/certs/domain.crt;
    ssl_certificate_key /etc/ssl/private/domain.key;

    include basic.conf;
}

何か案は?

更新:さらに奇妙になっています...すべてをsslにルーティングする一般的なルールを作成しようとしました(多くのブログで提案されているように)...現在、wwwバージョンと非wwwバージョンは自分自身にリダイレクトします...

server {

    listen 80 default_server;
    listen [::]:80 default_server;

    server_name _;

    return 301 https://$Host$request_uri;
}

これをデバッグする方法がわかりません...ところで...これはdockerswarmクラスターです...これが役立つ場合...

1
Lars Dittrich

これを自分でテストした後、conflicting server nameエラーが発生したため、元の回答を編集する必要がありました。

残念ながら、なぜまだこのリダイレクトループが発生するのかわかりません。おそらく、エラーはインクルードに起因します。しかし、私はあなたが求めていたものを達成する機能する(テストされた)構成をあなたに提示することができます:

一般的に:かなり単純なリダイレクトの場合、returnの代わりにredirectディレクティブを使用することをお勧めします( https://www.nginx.com/blog/creating-nginx-rewrite-ルール/

目標:どんな組み合わせでも

  • スキームの(httpまたはhttps
  • およびドメイン(example.comまたはwww.example.com

ブラウザに入力すると、https://www.example.comにリダイレクトされます

ここに設定があります:

server {

listen 80;

server_name www.example.com redirecttest.de;

return 301 https://www.example.com$request_uri;

}

server {

listen 443 ssl http2;

server_name www.example.com;

root /var/www/example.com/http;

ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;

}
1
geets