2026年5月20日

2026年5月20日

WordPressをHTTPSに移行する方法

はじめに

HTTPSはサイトとユーザー間の通信を暗号化する仕組みで、Googleが2014年からランキングシグナルとして採用しています。HTTP環境のWordPressをHTTPSに移行する際は、URL設定変更・混在コンテンツ修正・リダイレクト設定の3つを正しく実施することが重要です。

症状・原因

  • ブラウザのアドレスバーに「保護されていない通信」と表示される
  • HTTPSに移行したが画像やCSSが表示されない(混在コンテンツ)
  • WordPressの管理画面URLがHTTPのままになっている
  • HTTPからHTTPSへのリダイレクトが正しく設定されていない

解決手順

ステップ1:SSL証明書を取得する

# Let's Encrypt(無料)で証明書を取得(Certbot使用)

# Ubuntu/Debian + Nginx の場合
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

# Ubuntu/Debian + Apache の場合
sudo apt install certbot python3-certbot-apache
sudo certbot --apache -d example.com -d www.example.com

# 自動更新の確認(cron に登録済みか確認)
sudo certbot renew --dry-run

# 証明書の有効期限確認
sudo certbot certificates
共有ホスティングの場合(さくら・ロリポップ等):
1. ホスティングコントロールパネルにログイン
2. 「SSL」または「独自SSL」メニューを選択
3. 無料SSL(Let's Encrypt)を有効化
4. 反映まで数分〜数時間待つ

ステップ2:WordPressのURLをHTTPSに変更する

// wp-config.php に追加(データベース設定より前に記述)

// WordPress アドレスとサイトアドレスをHTTPSに強制
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');

// 管理画面もHTTPSに強制
define('FORCE_SSL_ADMIN', true);

// HTTPSをWordPressに認識させる(ロードバランサー・CDN経由の場合)
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
    && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
    $_SERVER['HTTPS'] = 'on';
}
-- データベースでURLを一括更新(wp-cli推奨、直接SQLは慎重に)
-- WP-CLI を使用する場合:
-- wp search-replace 'http://example.com' 'https://example.com' --skip-columns=guid

-- 直接SQLの場合(バックアップ必須):
UPDATE wp_options SET option_value = REPLACE(option_value, 'http://example.com', 'https://example.com') WHERE option_name IN ('siteurl', 'home');
UPDATE wp_posts SET guid = REPLACE(guid, 'http://example.com', 'https://example.com');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'http://example.com', 'https://example.com');
UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, 'http://example.com', 'https://example.com');

ステップ3:HTTPSへのリダイレクトを設定する

# .htaccess: HTTP → HTTPS への301リダイレクト(Apache)

RewriteEngine On

# HTTPSへリダイレクト
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# www あり → なし への統一(または逆)
# RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
# RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
# nginx.conf: HTTP → HTTPS への301リダイレクト

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # セキュリティヘッダー
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "SAMEORIGIN" always;
}

ステップ4:混在コンテンツ(Mixed Content)を修正する

// functions.php: HTTPリンクを動的にHTTPSに変換

add_action('template_redirect', function (): void {
    if (!is_ssl()) {
        return;
    }
    ob_start(function (string $buffer): string {
        // HTTP画像・スクリプト・スタイルをHTTPSに変換
        $buffer = str_replace(
            'http://example.com',
            'https://example.com',
            $buffer
        );
        return $buffer;
    });
});
# WP-CLI で混在コンテンツを一括修正
wp search-replace 'http://example.com' 'https://example.com' \
  --skip-columns=guid \
  --report-changed-only

# 混在コンテンツの確認(curlで確認)
curl -s https://example.com/ | grep -o 'src="http://' | wc -l
curl -s https://example.com/ | grep -o 'href="http://' | wc -l

ステップ5:HTTPSの動作を確認する

# SSL証明書の詳細確認
openssl s_client -connect example.com:443 -servername example.com < /dev/null 2>/dev/null \
  | openssl x509 -noout -dates

# HTTPSリダイレクトの確認
curl -I http://example.com/
# Location: https://example.com/ が返ればOK

# HSTSヘッダーの確認
curl -I https://example.com/ | grep -i strict
# Strict-Transport-Security: max-age=31536000 が返ればOK

# Mixed Content の確認(ブラウザのDevTools)
# Console タブで "Mixed Content" エラーを確認

注意事項

  • URLの一括置換はデータベースのバックアップを必ず取ってから実行してください。シリアライズされたデータが壊れる可能性があるため、wp search-replace の使用を強く推奨します
  • HSTSヘッダーを設定すると、ブラウザはその期間中HTTPでのアクセスを強制的にHTTPSにリダイレクトします。HTTP環境に戻す場合はブラウザキャッシュのクリアが必要です
  • Cloudflare使用時はSSLモードを「フルSSL(厳格)」に設定してください。「フレキシブル」ではサーバー間はHTTPになります

まとめ

wp-config.phpWP_HOME/WP_SITEURL をHTTPSで定義し FORCE_SSL_ADMIN を有効にします。.htaccess または nginx で HTTP→HTTPS の301リダイレクトを設定します。wp search-replace でデータベース内のHTTPリンクを一括置換し、混在コンテンツを解消します。最後にブラウザのDevToolsで Mixed Content エラーがないことを確認します。

お気軽にご相談ください

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