状況
夜中の2時。誰かがサイトをHTTPSに切り替えたか、ドメインを変更したか、.htaccessのルールを触ったばかりです。今や/wp-login.phpや/wp-adminへのアクセスは毎回同じ結果になります:
ERR_TOO_MANY_REDIRECTS — This page isn't redirecting properly when accessing /wp-login.php or /wp-admin
ブラウザは20回以上のリダイレクトリクエストを送り、ループを検出して終了します。あなたはロックアウトされています。一般訪問者への影響はループがどこで始まるかによって異なります。最速から最終手段まで、順を追って修正方法を確認していきましょう。
なぜこれが起きるのか
データベース内のsiteurlやhomeが実際にサーバーが配信しているURLと一致しない場合、WordPressはリダイレクトします。この不一致がWordPressが抜け出せないフィードバックループを生み出します。
最も一般的なトリガー:
wp-config.phpやデータベースを更新せずにHTTP → HTTPSに移行した- ドメイン名を変更したが設定の更新が部分的だった
wp-config.phpにハードコードされたWP_SITEURLまたはWP_HOME定数が間違っている- キャッシュプラグインまたはCDN(Cloudflare、Nginx FastCGI)がログインリダイレクトを横取りしている
- サーバーが拒否する古いWordPress認証クッキー — 再認証のためにリダイレクトし続け、クッキーが再び拒否され、その繰り返し
- リバースプロキシが
HTTPSヘッダーを除去しているため、ブラウザがすでにHTTPS上にいるにもかかわらず、WordPressがリクエストをプレーンHTTPとして認識する
クイック修正:wp-config.phpでsiteurlとhomeを上書きする
これが最も速いテストです。wp-config.phpを開き、/* That's all, stop editing! */コメントの前に次の2行を追加します:
define('WP_HOME', 'https://yourdomain.com');
define('WP_SITEURL', 'https://yourdomain.com');
これらの定数はデータベースに保存されている値より優先されます。/wp-login.phpをリロードしてください — ループが止まれば、データベースに誤ったURLがあるのが根本原因です。
ログインできたら、設定 → 一般に移動してWordPressアドレスとサイトアドレスの両方が正しいことを確認します。その後、データベースを正規の情報源として維持したい場合は、wp-config.phpからハードコードされた定数を削除できます。
データベースを直接修正する(wp-config.phpの上書きが効かない場合)
phpMyAdminで接続するか、MySQLに直接入ります:
mysql -u db_user -p db_name
実際に保存されている内容を確認します:
SELECT option_name, option_value
FROM wp_options
WHERE option_name IN ('siteurl', 'home');
HTTPからHTTPSに移行した場合、http://yourdomain.comがまだ残っているでしょう。修正します:
UPDATE wp_options SET option_value = 'https://yourdomain.com' WHERE option_name = 'siteurl';
UPDATE wp_options SET option_value = 'https://yourdomain.com' WHERE option_name = 'home';
phpMyAdminにアクセスできないがWP-CLIがインストールされている場合、2つのコマンドで同じことができます:
wp option update siteurl 'https://yourdomain.com'
wp option update home 'https://yourdomain.com'
クッキーとブラウザキャッシュをクリアする
サーバー側の修正を深く掘り下げる前に、古いクッキーを除外しましょう。クッキーは人々が思うよりも多くのリダイレクトループの原因になっています。
- シークレット/プライベートウィンドウを開いて
/wp-login.phpに直接アクセスしてみる - またはドメインのクッキーを削除する:DevTools → Application → Cookies → 右クリック → Clear
- 健全性チェックとして、まったく別のブラウザを試してみる
新しいブラウザでログインページが正常に読み込まれた場合、クッキーが原因でした。サーバーの変更は不要です — クリーンなセッションからログインするだけです。
.htaccessを修正する(Apache)
.htaccess内の1つの不正なリダイレクトルールでループが発生するには十分です。最も素早い確認方法:一時的にファイルを退避させます。
mv /var/www/html/.htaccess /var/www/html/.htaccess.bak
/wp-login.phpを再度試してみてください。ログインできた場合、.htaccessに不正なルールがありました。設定 → パーマリンク → 変更を保存からWordPressのデフォルト版を再生成するか、手動でこれを貼り付けます:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
リバースプロキシ背後のHTTPS修正(Nginx + Apacheスタック)
ロードバランサーまたはNginxリバースプロキシの背後でWordPressを実行していますか?PHPプロセスはブラウザがHTTPS上にいるにもかかわらずHTTPを見ている可能性が高いです。WordPressはHTTPSにリダイレクトします。NginxはリクエストをHTTPとしてプロキシします。WordPressは再びリダイレクトします。ブラウザが諦めるまで(通常20ホップ後)ループが続きます。
wp-config.phpにこれを追加します:
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
次に、Nginxの設定が実際にヘッダーを転送していることを確認します:
proxy_set_header X-Forwarded-Proto $scheme;
設定をテストしてリロードします:
sudo nginx -t && sudo systemctl reload nginx
Cloudflare SSLループの修正
CloudflareのSSLフレキシブルモードは、CDN移行後のWordPressリダイレクトループの最も一般的な原因の一つです。仕組みはこうです:フレキシブルモードはCloudflareがオリジンサーバーにプレーンHTTPで通信するよう指示します。WordPressはHTTPを検出して即座にHTTPSにリダイレクトします。CloudflareはそれをHTTPとしてプロキシします。WordPressは再びリダイレクトします。サイトは永遠に読み込まれません。
Cloudflareダッシュボード → SSL/TLSに移動し、モードをフルまたは**フル(厳格)**に切り替えます。数秒以内にループが止まります — キャッシュのパージは不要です。
ファイルシステム経由で全プラグインを無効化する(最終手段)
リダイレクトプラグイン、ログインセキュリティツール、一部のキャッシュプラグインがすべてこのループを引き起こす可能性があります。ダッシュボードに入れない場合は、ファイルシステムから無効化します:
mv /var/www/html/wp-content/plugins /var/www/html/wp-content/plugins.bak
/wp-login.phpを試してください。読み込まれた場合、プラグインが原因です。フォルダを元に戻します:
mv /var/www/html/wp-content/plugins.bak /var/www/html/wp-content/plugins
ダッシュボードからプラグインを1つずつ再有効化します。問題のあるプラグインを有効にした時にループが再発します — それがターゲットです。
修正が機能したことを確認する
- シークレットウィンドウで
https://yourdomain.com/wp-login.phpを開く — リダイレクトなしでログインフォームが表示されるはず - DevTools → Networkを確認:
/wp-login.phpのレスポンスは301や302の連鎖ではなく200 OKであるべき - ログインして管理ダッシュボードが正常に読み込まれることを確認する
wp option get siteurl && wp option get homeを実行して両方のデータベース値が正しいことを確認する

