WordPressの引き継ぎ案件で、今回初めてConoHa WINGサーバーを触る機会がありまして。
初期対応としてまずSSLを導入したところ、リダイレクトループ(ERR_TOO_MANY_REDIRECTS)が発生してしまいました。。原因と解決策をまとめます。
原因
原因は、テンプレート内で使用していた $_SERVER['HTTPS'] の判定でした。
調べたところ、ConoHa WINGはリバースプロキシ構成らしく、この場合、SSL通信の終端を中継機が担うパターンがあります。
クライアント(ブラウザ) → 中継機(リバースプロキシ) → Webサーバー(PHP / WordPress)
この構成では、Webサーバー(PHP / WordPress)にはHTTPとしてリクエストが渡されるようです。
結果、実際にはHTTPSアクセスであるにもかかわらず、$_SERVER['HTTPS'] はoffとなり、Webサーバー側が「HTTPでアクセスされた」と誤認。これに基づきWordPress側がHTTPSへリダイレクトを実行しますが、サーバー側は再びHTTPと誤認するため、リダイレクトを繰り返し、最終的にはそのまま無限ループに陥った模様。
これはConoHa WINGに限らず、リバースプロキシ構成のサーバー環境全般で発生し得るものです。
解決策
中継機がサーバーへ送る X-Forwarded-Proto ヘッダーを利用して、HTTPSでアクセスされていることを明示的に設定することで解決しました。
方法① : .htaccessで対応
SetEnvIf X-Forwarded-Proto "https" HTTPS=on.htaccessにX-Forwarded-ProtoからHTTPS 環境変数を設定する方法です。
今回はこの方法で解決しました。
方法② : wp-config.phpで対応
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}別案として、wp-config.phpからサーバー変数を補完する方法もあります。require_once(ABSPATH . 'wp-settings.php');より前に記述します。
まとめ・その他のパターン
今回は該当しませんでしたが、.htaccessに手動でHTTPSへ強制リダイレクトを設定しているケースでも同様の症状が発生する模様。原因の本質は同じですね。
SSL適用後にリダイレクトがおかしくなったら、「プロキシ越しでHTTPSが正しく認識されているか」を、まずは確認していきたいと思います。



