2026年5月20日

2026年5月20日

WordPressのHTTPからHTTPSへのリダイレクトを設定する方法

はじめに

SSL証明書を設置した後、HTTPへのアクセスをHTTPSに301リダイレクトする設定は必須です。設定を誤るとリダイレクトループが発生したり、一部のページがHTTPのまま残ったりします。サーバー環境に合わせた正しい設定方法を解説します。

症状・原因

  • http://example.com にアクセスしてもHTTPSにならない
  • リダイレクトが発生するが「リダイレクトが多すぎます」エラーになる
  • wwwあり/なしで別々のURLとして認識されている
  • Cloudflare経由でリダイレクトループが発生する

解決手順

ステップ1:リダイレクトの現状を確認する

# HTTP → HTTPS のリダイレクトを確認
curl -I http://example.com
# Location: https://example.com/ が返れば設定済み
# HTTP/1.1 301 Moved Permanently が理想

# リダイレクトチェーンを確認(ループ検出)
curl -L -I --max-redirs 10 http://example.com 2>&1 | grep -E "HTTP|Location"

# www あり → なし(またはその逆)の確認
curl -I http://www.example.com
curl -I https://www.example.com

ステップ2:Apache(.htaccess)でリダイレクトを設定する

# .htaccess: HTTP → HTTPS リダイレクト(基本パターン)
<IfModule mod_rewrite.c>
RewriteEngine On

# ① HTTPS でない場合にリダイレクト
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>
# .htaccess: www なし → www あり + HTTPS に統一する場合
<IfModule mod_rewrite.c>
RewriteEngine On

# HTTP + www なし → HTTPS + www なし
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://example.com%{REQUEST_URI} [R=301,L]

# HTTPS + www あり → HTTPS + www なし
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^(.*)$ https://%1%{REQUEST_URI} [R=301,L]
</IfModule>
# .htaccess: ロードバランサー・CDN(Cloudflare等)経由の場合
# X-Forwarded-Proto ヘッダーを使用
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</IfModule>

ステップ3:Nginxでリダイレクトを設定する

# /etc/nginx/sites-available/example.com

# HTTP → HTTPS リダイレクト用サーバーブロック
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;

    # 全リクエストを HTTPS にリダイレクト
    return 301 https://example.com$request_uri;
}

# www あり → www なし + HTTPS
server {
    listen 443 ssl http2;
    server_name www.example.com;
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    return 301 https://example.com$request_uri;
}

# メインサーバーブロック
server {
    listen 443 ssl http2;
    server_name example.com;
    # ... 通常の設定
}

ステップ4:wp-config.phpでWordPressのリダイレクトループを防ぐ

// wp-config.php: Cloudflare やリバースプロキシ経由でのループを防ぐ

// 方法1: X-Forwarded-Proto ヘッダーを信頼する
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
    && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}

// 方法2: Cloudflare の CF-Visitor を使用
if (isset($_SERVER['HTTP_CF_VISITOR'])) {
    $cf_visitor = json_decode($_SERVER['HTTP_CF_VISITOR'], true);
    if (isset($cf_visitor['scheme']) && $cf_visitor['scheme'] === 'https') {
        $_SERVER['HTTPS'] = 'on';
    }
}

define('FORCE_SSL_ADMIN', true);
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');
# リダイレクトループが発生している場合の診断
# 1. WordPress の siteurl と home を確認
wp option get siteurl
wp option get home

# 2. .htaccess を一時的にリネームしてループが解消するか確認
mv /var/www/html/.htaccess /var/www/html/.htaccess.bak

# 3. プラグインを全て無効化してループが解消するか確認
wp plugin deactivate --all

# 4. 原因プラグインを特定
wp plugin activate plugin-name-1
# ... 1つずつ有効化してループ発生を確認

ステップ5:リダイレクト設定を確認・テストする

# リダイレクトが正しく機能しているか確認
curl -I http://example.com
# 期待される出力:
# HTTP/1.1 301 Moved Permanently
# Location: https://example.com/

# HTTPS が正常に動作しているか
curl -I https://example.com
# 期待される出力:
# HTTP/2 200

# www なし → www あり の確認
curl -I http://www.example.com
# HTTP/1.1 301 Moved Permanently
# Location: https://example.com/

# Google の推奨: 全パターンが1つの正規URLに向くこと
# http://example.com → https://example.com (301)
# http://www.example.com → https://example.com (301)
# https://www.example.com → https://example.com (301)
// functions.php: WordPress 内部リダイレクトの強制
add_action('template_redirect', function(): void {
    if (!is_ssl() && !is_admin()) {
        wp_redirect('https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], 301);
        exit;
    }
});

注意事項

  • Cloudflareを使用している場合、Cloudflareの「SSL/TLS」設定を「Full」または「Full (strict)」にしないとリダイレクトループが発生します。「Flexible」設定のままでサーバー側もHTTPSリダイレクトを設定するとループになります
  • .htaccessでのRewriteCond %{HTTPS} offは、X-Forwarded-Protoを使うロードバランサー経由では機能しないことがあります。その場合はHTTP_X_FORWARDED_PROTOを使用してください
  • 301リダイレクトはブラウザにキャッシュされます。テスト中は302(一時リダイレクト)を使い、確認後に301に変更することを推奨します

まとめ

HTTP→HTTPSリダイレクトは①curl -I http://example.comで現状確認、②Apache環境では.htaccessRewriteCond %{HTTPS} off+RewriteRuleを追加、③Nginx環境ではHTTP用serverブロックにreturn 301 https://...を設定、④Cloudflare等のリバースプロキシにはwp-config.phpHTTP_X_FORWARDED_PROTO$_SERVER['HTTPS']に反映、⑤curl -Iの4パターン(http/https × www有無)で全て正規URLに301リダイレクトすることを確認します。

お気軽にご相談ください

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