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