web-dev-qa-db-ja.com

cloudflareの柔軟なsslを使用してループをリダイレクトする

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をどのように設定しますか?

10
Deqq

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

connection is always 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パターンの応答を変更できます。

Using cloudflare's page rules

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

Always use 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
}
30
AD7six

有効なSSL証明書を持っている場合、これで問題を解決できます。 [Crypto]ボックスをクリックし、図のようにFull (strict)を選択します。 enter image description here

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

5
prosti

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

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

Cloudflare's "Always Use HTTPS" option

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

0
Chad