2026年10月10日
2026年10月10日
WordPressをHTTPSに統一する手順|URL変更・301リダイレクト・混在コンテンツ対策
WordPress サイトを HTTPS に統一するには、①サーバーで HTTPS が使えるようにする、②WordPress のURLを https:// に変える、③データベースの中のURLを置き換える、④HTTP へのアクセスを HTTPS へ 301 リダイレクトする、の4つを行います。この記事ではその順番で説明します(2026年10月時点の WordPress 6.8 系を前提にしています)。
始める前に
- 証明書が入っていることを確かめる。ブラウザーで
https://のURLを開き、警告が出ないことを見ます。証明書の取得はLet's EncryptでWordPressをSSL化する手順を参照してください - データベースとファイルのバックアップを取る。URLの変更を間違えると管理画面に入れなくなることがあります
- 以下の
example.comは自分のドメインに置き換えます
curl -sI https://example.com/ | head -n 1
HTTP/1.1 200 OK や HTTP/2 200(またはリダイレクトの 301)が返れば、HTTPS で応答しています。
手順1:WordPressのURLをHTTPSに変える
管理画面から変える
「設定」→「一般」の「WordPress アドレス (URL)」と「サイトアドレス (URL)」を、どちらも https:// で始まるURLに変えて「変更を保存」を押します。保存するとログアウトされるので、https:// のURLでログインし直します。
WordPress 5.7 以降では、サーバーが HTTPS に対応していれば、「ツール」→「サイトヘルス」の HTTPS に関する項目に、2つのURLを一度に HTTPS に切り替えるボタンが表示されます。このボタンで切り替えた場合、記事本文の中に残った自分のサイトの http:// のURLは、表示するときに https:// に置き換えられます。
WP-CLIで変える
wp option update home 'https://example.com'
wp option update siteurl 'https://example.com'
wp-config.php に WP_HOME や WP_SITEURL が書かれている場合は、設定画面では変えられません。wp-config.php の値を https:// に書き換えます。
手順2:データベースの中のURLを置き換える
記事本文やカスタムフィールド、ウィジェットに http://example.com が残っていると、画像や CSS が HTTP で読み込まれ、ブラウザーが混在コンテンツとして警告したり表示しなかったりします。WP-CLI の wp search-replace で置き換えます。
# まず変更される件数を確かめる
wp search-replace 'http://example.com' 'https://example.com' --skip-columns=guid --dry-run
# 問題なければ実行する
wp search-replace 'http://example.com' 'https://example.com' --skip-columns=guid
wp search-replaceは、プラグインの設定などに使われるシリアライズされたデータの文字数も直して置き換えます。MySQL のUPDATE … REPLACE()で直接書き換えると、httpがhttpsになって文字数が変わり、シリアライズされたデータが壊れることがあるため使いません- 投稿の
guid列は、記事を識別するための値で、RSS リーダーなどが記事を見分けるのに使います。WordPress の公式ドキュメントでは変えないよう案内されているため、--skip-columns=guidで除外します - マルチサイトでは
--networkを付けます wwwの有無も含めて、実際に使われているURLの形で置き換えます
WP-CLI が使えない場合は、Better Search Replace などのシリアライズ対応の置換プラグインを使います。
手順3:HTTPをHTTPSへ301リダイレクトする
Apache(.htaccess)
WordPress のドキュメントルートにある .htaccess の、# BEGIN WordPress より前に書きます。# BEGIN WordPress から # END WordPress の間は、パーマリンク設定を保存したときに WordPress が書き換えるためです。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
</IfModule>
.htaccess はアクセスのたびに読み込まれるため、Web サーバーの再起動は不要です。サーバーの設定ファイルを編集できる場合は、HTTP 用の VirtualHost に Redirect permanent / https://example.com/ を書く方法もあります。
Nginx
HTTP(80番ポート)の server ブロックで、すべてのアクセスを HTTPS へ返します。
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri;
}
設定を変えたら sudo nginx -t で構文を確かめ、sudo systemctl reload nginx で読み込み直します。
確認
curl -sI http://example.com/sample-page/ | grep -iE '^(HTTP|location)'
301 と、Location: https://example.com/sample-page/ が返れば成功です。リダイレクトの書き方はWordPressのHTTPからHTTPSへの301リダイレクト設定でも詳しく説明しています。
手順4:管理画面とログインをHTTPSに限る
サイトのURLを https:// にすれば、管理画面も HTTPS で開きます。HTTP でログイン画面を開かれた場合にも HTTPS に切り替えるには、wp-config.php に次を追加します(「編集が必要なのはここまでです」より上)。
<?php
define( 'FORCE_SSL_ADMIN', true );
プロキシやCDNの後ろにある場合
Cloudflare やロードバランサーが HTTPS を受け、サーバーへは HTTP で中継している構成では、サーバー側の %{HTTPS} が常に off になり、リダイレクトがループします。この場合は、プロキシが付ける X-Forwarded-Proto ヘッダーを使います。
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
WordPress 自身にも HTTPS だと判断させるため、wp-config.php に次を書きます。
<?php
if ( isset( $_SERVER['HTTP_X_FORWARDED_PROTO'] ) && 'https' === $_SERVER['HTTP_X_FORWARDED_PROTO'] ) {
$_SERVER['HTTPS'] = 'on';
}
このヘッダーは誰でも付けて送れるため、プロキシを通さずサーバーに直接届くアクセスを受け付けない構成で使います。Cloudflare の場合は、暗号化モードを「Full (strict)」にしてサーバーまで HTTPS で接続すれば、この設定は通常要りません。
手順5:混在コンテンツを確認する
HTTPS のページの中で、画像・CSS・JavaScript を http:// で読み込んでいると、ブラウザーのアドレスバーに警告が出たり、読み込みが止められたりします。
- ログアウトした状態で主なページを開き、ブラウザーの開発者ツールのコンソールに「Mixed Content」の警告が無いか見る
- テーマやプラグインのファイル、カスタマイザーの追加 CSS に
http://が直接書かれていないか確かめる - 外部のサービス(埋め込みや広告など)を
http://で読み込んでいる場合は、https://のURLに変える - データベースに古いURLが残っていないか、次のコマンドで検索する
wp db search 'http://example.com' --stats
詳しい探し方はWordPressの混在コンテンツ(Mixed Content)を直す方法を参照してください。
手順6:HSTSを設定する(任意)
HSTS(HTTP Strict Transport Security)は、一度アクセスしたブラウザーに、以後はそのドメインに HTTPS でしか接続しないよう指示するヘッダーです。HTTPS で問題なく動くことを確かめてから設定します。Apache では mod_headers を使います。
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=300"
</IfModule>
最初は max-age=300(5分)のように短くして様子を見て、問題がなければ max-age=31536000(1年)に延ばします。設定すると、証明書の期限切れなどが起きたときに、訪問者は警告を無視して閲覧できなくなります。includeSubDomains は、HTTPS に対応していないサブドメインがあると、そこにアクセスできなくなるため、すべてのサブドメインを確認してから付けます。ヘッダーの設定はWordPressのセキュリティヘッダー設定方法も参照してください。
切り替えた後に行うこと
- Google Search Console で、HTTPS のURLが含まれるプロパティ(ドメインプロパティか
https://の URL プレフィックス)を確認し、サイトマップをhttps://のURLで送り直す - 証明書の自動更新が動いているか確かめる(Let's Encrypt の証明書は有効期間が短く、自動更新を前提にしている)
- 外部サービス(Google アナリティクス、SNS の設定、広告など)に登録しているサイトのURLを
https://に直す
まとめ
- 「設定」→「一般」の2つのURL(またはサイトヘルスのボタン、
wp option update)で WordPress のURLをhttps://にする - 本文のURLは
wp search-replaceで、--skip-columns=guidを付けて置き換える。SQL のREPLACE()で直接書き換えない - 301 リダイレクトは
.htaccessの# BEGIN WordPressより前か、Nginx の 80番ポートの server ブロックに書く - プロキシの後ろでは
X-Forwarded-Protoで判定する - 混在コンテンツを確かめてから、必要なら HSTS を短い期間から設定する