cloudflareのフレキシブルsslを使用してループをリダイレクトする


10

CloudFlareが提供する柔軟なSSLを自分のサイトに実装しようとしています。

これが私のnginx設定です:

# PHP-FPM upstream; change it accordingly to your local config!
upstream php-fpm {
    server 127.0.0.1:9000;
}

server {
    listen         80;
    server_name    example.com www.example.com;
    return         301 https://$server_name$request_uri;
}

server {
    ## Listen ports
    listen 443;

    # use _ if you want to accept everything, or replace _ with domain
    server_name example.com www.example.com;

    location / {
      #proxy_set_header        X-Forwarded-Proto $scheme;
      proxy_set_header X_FORWARDED_PROTO https;
      proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header  Host $http_host;
      proxy_set_header  X-Url-Scheme $scheme;
      proxy_redirect    off;
      proxy_max_temp_file_size 0;
    }

(...rest of config...)

しかし、ウェブサイト(Wordpress)に接続しようとすると、リダイレクトループ(chrome:ERR_TOO_MANY_REDIRECTS)が表示されます。これを防ぐためにnginxをどのように設定しますか?

回答:


30

Cloudflareの柔軟なsslは、cloudflareとサーバー間の接続が常に http 経由であることを意味します。

接続は常にhttpです

これを考えると、関連性の問題で唯一のサーバーブロックはこれです。

server {
   listen         80;
   server_name    example.com www.example.com;
   return         301 https://$server_name$request_uri;
}

リダイレクトループが発生する理由は明らかです。柔軟なsslソリューションを使用してhttps接続を強制する2つのソリューションがあります。

Cloudflareのページルールを使用する

場合は、サーバーへのアクセスがCloudFlareのを経由して、排他的であるあなたは、CloudFlareの自身の使用することができますページのルールをドメイン、サブドメイン、または任意のURLパターンのための応答を修正します:

cloudflareのページルールの使用

オプションの1つは、httpsを強制することです。

常にHTTPSを使用する

テスト $http_x_forwarded_proto

これらのシナリオでは、転送されたプロトコルをテストし、それに基づいてリダイレクトすることが可能です。

server {
   listen         80;
   server_name    example.com www.example.com;

   if ($http_x_forwarded_proto = "http") {
     return 301 https://$server_name$request_uri;
   }

   ... directives to generate a response
}

そして、この場合、すべてがhttpで送信されるわけではないなど、私のhttps接続にエラーがありますか?
Deqq 14

cloudflare / nginxをどのように設定するかは関係ありません。html コンテンツは、そのようなエラーが報告されるかどうかを決定します。
AD7six 14

この回答の最初の行は正しくありません。ブラウザとCloudFlareの間の接続はTLS暗号化されており、CloudFlareからオリジンサーバーへの接続はhttpです。リダイレクトループは、暗号化タイプを誤って指定するページルールまたは高レベルの設定によって引き起こされる可能性があります。
Tim、

これに役立つプラグインもあります:en-nz.wordpress.org/plugins/cloudflare-flexible-ssl
Tim

5

有効なSSL証明書を持っている場合、これで問題を解決できます。[Crypto]ボックスをクリックFull (strict)して、図のように選択します。 ここに画像の説明を入力してください

NginxのWebサーバー構成ファイルを更新する必要はありません。


完全(厳密)は、元のWebサーバーに有効な証明書チェーンを持つ有効なSSL証明書がある場合にのみ機能します。自己署名を含むすべてのSSL証明書で完全に機能します。これは質問に対する良い答えではありません。
Tim

はい、わかりました。質問ではフレキシブル証明書について言及しました。私はあなたのフィードバックのおかげで私の答えを改善し、私はより具体的になります。ここでナレッジベースを改善しています。Googleにとって、SEOの観点から考えると、有効なSSL証明書が最も価値があります。これを投稿して後悔していません。
prosti

フレキシブル/フル/ストリクトはSEOに違いはありません。その設定はオリジンサーバーへの接続用です。Cloudflareは、ページをリクエストするすべての人に共有のhttps証明書を提示します。それがオリジンにどのように接続するかは、ほとんど関係ありません。
Tim

サーバーに有効なSSL証明書があることを前提としています(OPは指定せず、同様の設定googleを介してここに来ました)。これは優れたオプションです。ページルールを介して特定のサブドメインにスコープすることもできます。
skoczen 2017年

これは、有効なSSLがあった私にとって非常に良い答えです。
フィリップ

0

AD7sixの答えは非常に優れていますが、ページルールを必要としない簡単なソリューションがあるようです。これが以前の回答以降の新しい追加かどうかはわかりませんが、執筆時点でCloudflareを使用した場合の無料のページルールが3つしかない場合は特に、この質問に必ず文書化する必要があります。

特定のドメインでフレキシブルSSL Cryptoを有効にすると、タブを下にスクロールしてAlways use HTTPSオプションを有効にできます。このオプションは、リダイレクトループの問題をシームレスに解決します(AD7sixの回答で完全に説明されています)。

Cloudflareの「常にHTTPSを使用する」オプション

このオプションはnginxでの動作が確認されています。さらに、フレキシブルSSLがすでに有効になっていて問題なく機能している場合、このオプションが機能しないサーバー設定はありません。


CloudflareのUIが変更された場合(または新しいオプションが利用可能になった場合)は、競合する回答を作成するのではなく、既存の回答を編集することをお勧めします。
AD7six

@ AD7sixこれは古いUIへの追加であり、置き換えではないと考えています。つまり、古い答えはまだ有効であるはずです。したがって、別の答えはオリジナルを編集するよりも論理的でしょう、そうではありませんか?
チャド

私は「これまで長い間これをしなければならなかったが、今はそれのためのボタンがある!」とは思わない。新しい答えです、いいえ:)
AD7six
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.