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