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をどのように設定しますか?
Cloudflareの柔軟なssl は、http:経由でcloudflareとサーバー間の接続がalwaysであることを意味します:
これを考えると、関連性の問題で唯一のサーバーブロックはこれです。
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$server_name$request_uri;
}
リダイレクトループが発生する理由は明らかです。柔軟なsslソリューションを使用してhttps接続を強制する2つのソリューションがあります。
サーバーへのアクセスがcloudflare経由のみである場合は、cloudflare独自の ページルール を使用して、ドメイン、サブドメイン、または任意のURLパターンの応答を変更できます。
オプションの1つは、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
}
AD7sixの答えは非常に良いですが、ページルールを必要としない簡単なソリューションがあるようです。これが以前の回答以降の新しい追加かどうかはわかりませんが、執筆時点でCloudflareの3つの無料ページルールしか取得していない場合は特に、この質問に必ず文書化する必要があります。
特定のドメインでフレキシブルSSLを有効にしている場合は、Crypto
タブを下にスクロールしてAlways use HTTPS
オプション。このオプションは、リダイレクトループの問題をシームレスに解決します( AD7sixの回答 で完全に説明されています)。
このオプションはnginxでの動作が確認されています。さらに、Flexible SSLがすでに有効になっていて問題なく機能している場合、このオプションが機能しないサーバー設定はありません。