リダイレクトループが止まらない!
- Q.htaccessを修正してもリダイレクトループが止まらないんですが(汗)
- A
リバースプロキシ使用時はWPのwp-config.phpも修正する必要があります。
CDNを使ってなくてもキャッシュの制御にリバースプロキシが使われてます。
ウチは無縁だと思っても、実は知らないところで結構使われてたりします。XServerの場合はXアクセラレーターがNginxを用いたリバースプロキシです。
Xアクセラレーターを使う場合は.htaccessの修正だけでは上手く動きません。
リダイレクトの標準設定
XServerでのリダイレクト設定はこうなってます。.htaccessの冒頭部分です。
SetEnvIf Request_URI ".*" Ngx_Cache_NoCacheMode=off
SetEnvIf Request_URI ".*" Ngx_Cache_AllCacheMode
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Rewrite~がリダイレクト設定です。SetEnvIf~はXアクセラレーターを利用すると追加されます。Xアクセラレーターはリバースプロキシなので、これがリダイレクト設定と競合してリダイレクトループが発生します。
Xアクセラレーターを使わなければエラーは消えるはずですが、それでは表示速度が低下するので、これを活かしたままリダイレクトエラーを解消する方法を考えます。
変更が必要なファイルは二つ
リダイレクトエラーが発生するのはリバースプロキシ経由のアクセス(http)をクライアントからの直接アクセス(https)と誤認するのが原因です。そこでHTTP:X-Forwarded-Protoを用いてプロトコルでhttp/httpsを判定させます。
しかしそれを.htaccessに追記しただけではWordPressはこのリクエストヘッダーを認識出来ません。そこで下記の指示通りwp-config.phpにも設定を追加します。
WordPressをリバースプロキシ環境(SSLオフロード等)で運用する際のリダイレクトループは、プロキシがhttpsで受けても、バックエンドのWordPressにhttpで転送されるため発生します。解決策は、wp-config.phpにHTTP_X_FORWARDED_PROTOを認識させる設定を追加することです。
WordPress
これはWordPress公式が提示している方法ですから間違いはないと思います。
全然知らなかったので一年くらいリダイレクトループに悩まされ大変苦労しました。
具体的な修正方法
赤字が追加した設定です。
.htaccessは冒頭のこの位置で。wp-config.phpも冒頭に記述してやればいいようです。自分の場合はWP-Cronの設定の下に続けて記述しました。
.htaccess
SetEnvIf Request_URI ".*" Ngx_Cache_NoCacheMode=off
SetEnvIf Request_URI ".*" Ngx_Cache_AllCacheMode
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
wp-config.php
<?php
/** WP-Cron停止 */
define('DISABLE_WP_CRON', true);
/**
/** リバースプロキシの使用 */
define('FORCE_SSL_ADMIN', true);
if ( ! empty( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https' ) {
$_SERVER['HTTPS']='on';
}
/**
忘れがちですが、WordPressを複数動かしてる場合、設置したすべてのWPのwp-config.phpを修正しないといけません。一つでも忘れるとエラーが出ますので御注意下さい。
設定を変更した結果
修正後、大量に記録されていたエラーログは日に数件程度になりました。
設定変更後も当面はキャッシュなどの影響で散発的にエラーが記録されると思います。誤動作する場合もあるそうなので数件のエラーなら問題ありません。
動作確認にはリダイレクトチェッカーを使うといいです。しかし以前も転送は問題なかったのにエラーが起きました。これまで何度も糠喜びさせられたので、しばらく様子を見てみます。
サーバーにより対策は異なる
リダイレクトループの対策は難解です。ネットに出てる方法が使えるとは限りません。今回紹介した対策はXServerでWordPressを動かしてる場合なので、他社のサーバーでは使えません。
何が実行可能なのかは利用中のサーバーの設定によります。たとえばXServerではRewriteCond %{HTTPS} !onは使えますが、RewriteCond %{HTTPS} offは使えません。

AIにエラーログを見せて調べてもらったらデタラメなアドバイスばかりで余計に混乱しました。でもヒントとなりそうな情報は得られました。



※コメントは最大500文字、5回まで送信できます