はじめに
Cloudflare では、以下の SSL mode を活用することで、Cloudflareーオリジン間の通信について、HTTPS を使うように制御できます。
Cloudflareーオリジン間の通信が、実際に HTTPS で行われるかどうかを調査します。
確認方法
オリジン Web サーバーに Apache を使います。
デフォルトでは Cloudflare によって、HTTP リクエストヘッダ X-Forwarded-Proto と Cf-Visitor は同じ値に設定されます。
How does Cloudflare handle HTTP Request headers? – Cloudflare Help Center
今回は、オリジンサーバーで以下のように接続プロトコルごとに X-Forwarded-Proto を上書きするように設定を追加します。
RequestHeader set X-Forwarded-Proto "http"
<VirtualHost _default_:443>
RequestHeader set X-Forwarded-Proto "https"
</VirtualHost>
設定を反映するために、sudo systemctl restart httpd でサービスを再起動します。
その後に、以下のコマンドで確認できます。
curl -s http://khayama.ml | grep -e Cf-Visitor -e X-Forwarded-Proto
curl -s https://khayama.ml | grep -e Cf-Visitor -e X-Forwarded-Proto
Cloudflareーオリジン間の通信が HTTP の場合
X-Forwarded-Proto: http となります。
例えば、SSL mode を Flexible にした場合、クライアントーオリジン間を https で接続すると、Cloudflareーオリジン間の通信は http になります。
% curl -s https://khayama.ml | grep -e Cf-Visitor -e X-Forwarded-Proto
Cf-Visitor: {"scheme":"https"} <br />
X-Forwarded-Proto: http <br />
Cloudflareーオリジン間の通信が HTTPS の場合
X-Forwarded-Proto: https となります。
例えば、SSL mode を Strict (SSL-Only Origin Pull) にした場合、クライアントーオリジン間を http で接続すると、Cloudflareーオリジン間の通信は https になります。
% curl -s http://khayama.ml | grep -e Cf-Visitor -e X-Forwarded-Proto
Cf-Visitor: {"scheme":"http"} <br />
X-Forwarded-Proto: https <br />
確認結果
以下のようになりました。
| SSL mode | Client --> Cloudflare | Cloudflare --> Origin |
|---|---|---|
| Off | HTTP | HTTP |
| Off | HTTPS --> HTTP (301 Redirect) | - |
| Flexible | HTTP | HTTP |
| Flexible | HTTPS | HTTP |
| Full | HTTP | HTTP |
| Full | HTTPS | HTTPS |
| Full (Strict) | HTTP | HTTP |
| Full (Strict) | HTTPS | HTTPS |
| Strict (SSL-Only Origin Pull) | HTTP | HTTPS |
| Strict (SSL-Only Origin Pull) | HTTPS | HTTPS |
完全に HTTPS 化するには
「Always Use HTTPS」の機能を使えば、クライアントーCloudflare間の通信に対して HTTP を HTTPS にリダイレクトできます。
ただし、SSL mode = Off と「Always Use HTTPS」は併用できません。

「Always Use HTTPS」を組み合わせた場合の結果は、以下のようになります。
| SSL mode | Client --> Cloudflare | Cloudflare --> Origin |
|---|---|---|
| Off | HTTP | HTTP |
| Off | HTTPS --> HTTP (301 Redirect) | - |
| Flexible | HTTP --> HTTPS (301 Redirect) | - |
| Flexible | HTTPS | HTTP |
| Full | HTTP --> HTTPS (301 Redirect) | - |
| Full | HTTPS | HTTPS |
| Full (Strict) | HTTP --> HTTPS (301 Redirect) | - |
| Full (Strict) | HTTPS | HTTPS |
| Strict (SSL-Only Origin Pull) | HTTP --> HTTPS (301 Redirect) | - |
| Strict (SSL-Only Origin Pull) | HTTPS | HTTPS |

