2026年5月17日

2026年5月17日

WordPressのリダイレクトループを解決する方法

はじめに

「このページにアクセスできません。リダイレクトが多すぎます(ERR_TOO_MANY_REDIRECTS)」というエラーはWordPressのリダイレクトループが原因です。.htaccess の設定ミス・siteurl と home の不一致・リバースプロキシでの HTTPS 誤検出などが主な原因として挙げられます。本記事ではループの特定から各原因への対処法まで体系的に解説します。

症状・原因

  • ブラウザで「ERR_TOO_MANY_REDIRECTS」が表示される
  • curl -I でリダイレクトが無限ループしている
  • .htaccess が破損または誤った設定になっている
  • wp_options テーブルの siteurlhome が実際のURLと一致していない
  • Nginx リバースプロキシが SSL を終端しているため、WordPress 側で HTTPS を検出できず無限にリダイレクトする
  • redirect_canonical が特定ページでループを起こしている

解決手順

ステップ1:curl と DevTools でリダイレクトチェーンを確認する

# curl でリダイレクトのチェーンを確認する(最大10回追跡)
curl -IL --max-redirs 10 http://example.com

# レスポンスヘッダーのみ確認(-I: HEAD リクエスト)
curl -I http://example.com
# Location ヘッダーがどこを指しているか確認する

# HTTPS のリダイレクト確認
curl -I https://example.com

# クッキーなしでのリダイレクト確認(クッキーが原因のループを除外)
curl -I --cookie "" http://example.com

# ブラウザの DevTools での確認方法:
# 1. F12 → Network タブを開く
# 2. "Preserve log" にチェックを入れる
# 3. サイトにアクセスして 301/302 のリクエストを追う
# 4. Response Headers の Location を確認する

ステップ2:.htaccess を再生成またはリセットする

# .htaccess を手動でリセットする(WordPress 標準の内容)
# /var/www/html/.htaccess を以下の内容で上書きする

# 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
# WP-CLI でパーマリンク設定を再保存し .htaccess を再生成する
wp rewrite flush --hard

# .htaccess のバックアップを取ってから上書きする
cp /var/www/html/.htaccess /var/www/html/.htaccess.bak
wp rewrite flush --hard

# .htaccess が書き込み不可の場合はパーミッションを確認
ls -la /var/www/html/.htaccess
# -rw-r--r-- が理想(644)
chmod 644 /var/www/html/.htaccess

ステップ3:siteurl/home の不一致を修正する

# WP-CLI で現在の siteurl と home を確認する
wp option get siteurl
wp option get home

# 正しい値に更新する
wp option update siteurl 'https://example.com'
wp option update home 'https://example.com'

# WP-CLI が使えない場合:MySQL で直接更新する
# mysql -u wordpress_user -p wordpress_db
-- wp_options テーブルで siteurl と home を確認・修正する
SELECT option_name, option_value
FROM wp_options
WHERE option_name IN ('siteurl', 'home');

-- HTTP→HTTPS の修正
UPDATE wp_options
SET option_value = 'https://example.com'
WHERE option_name = 'siteurl';

UPDATE wp_options
SET option_value = 'https://example.com'
WHERE option_name = 'home';

ステップ4:Nginx プロキシ環境での HTTPS ループを修正する

<?php
// wp-config.php に追記(Nginx が SSL を終端して WordPress に HTTP で渡す場合)

// Nginx が X-Forwarded-Proto: https を送っている場合
if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] )
    && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'] ) {
    $_SERVER['HTTPS'] = 'on';
}

// Nginx が X-Forwarded-SSL: on を送っている場合
if ( isset( $_SERVER['HTTP_X_FORWARDED_SSL'] )
    && 'on' === $_SERVER['HTTP_X_FORWARDED_SSL'] ) {
    $_SERVER['HTTPS'] = 'on';
}

// CloudFlare や Load Balancer の場合
if ( isset( $_SERVER['HTTP_CF_VISITOR'] ) ) {
    $cf_visitor = json_decode( $_SERVER['HTTP_CF_VISITOR'] );
    if ( isset( $cf_visitor->scheme ) && 'https' === $cf_visitor->scheme ) {
        $_SERVER['HTTPS'] = 'on';
    }
}
# Nginx の設定で X-Forwarded-Proto ヘッダーを WordPress に送る
server {
    listen 443 ssl;
    server_name example.com;

    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        # HTTPS を PHP/WordPress に伝えるヘッダー
        fastcgi_param HTTPS on;
        fastcgi_param HTTP_X_FORWARDED_PROTO https;
        include fastcgi_params;
    }
}

ステップ5:redirect_canonical を特定ページで無効化する

<?php
// functions.php に追記

// 特定の条件でのみ redirect_canonical を無効化する
add_action( 'template_redirect', 'disable_redirect_canonical_conditionally', 1 );

function disable_redirect_canonical_conditionally() {
    // フロントページでのループを防ぐ
    if ( is_front_page() ) {
        remove_filter( 'template_redirect', 'redirect_canonical' );
        return;
    }

    // 特定のスラッグを持つページでループが起きる場合
    if ( is_page( 'contact' ) || is_page( 'landing-page' ) ) {
        remove_filter( 'template_redirect', 'redirect_canonical' );
        return;
    }

    // カスタム投稿タイプでのループ
    if ( is_singular( 'custom_post_type' ) ) {
        remove_filter( 'template_redirect', 'redirect_canonical' );
        return;
    }
}

// 全ページで redirect_canonical を無効化する場合(非推奨)
// remove_filter( 'template_redirect', 'redirect_canonical' );

// カスタムリダイレクト処理(redirect_canonical の代替)
add_filter( 'redirect_canonical', 'custom_redirect_canonical', 10, 2 );

function custom_redirect_canonical( $redirect_url, $requested_url ) {
    // ループが発生するパターンを除外する
    if ( $redirect_url === $requested_url ) {
        return false; // リダイレクトしない
    }
    return $redirect_url;
}

注意事項

  • 301 リダイレクトのキャッシュ: ブラウザが 301 をキャッシュしている場合があります。DevTools でキャッシュをクリアしてから確認してください。
  • プラグインの影響: Redirection・Yoast SEO・Rank Math などのプラグインが独自のリダイレクトを追加している場合があります。プラグインを一時的に無効化して切り分けてください。
  • CDN・キャッシュ: Cloudflare などの CDN がリダイレクトをキャッシュしている場合は、CDN のキャッシュをパージしてください。

まとめ

リダイレクトループは「curlで原因箇所を特定→.htaccess リセット→siteurl修正→プロキシHTTPS対応→redirect_canonical調整」の手順で解決できます。プロキシ環境での HTTPS 検出は特に見落としがちなため注意が必要です。関連記事:WordPressのアップロードディレクトリのパーミッションエラーを解決する方法

お気軽にご相談ください

お見積りへ お問い合わせへ