最初からWordPressをSSL化することはあっても、途中からWordPressをSSL化するっていうプロジェクトは案外やったことがなかった。今回自分のサイトだからやってみるかとSSL化してみたんですが、SSL化することによって、色々変更しなければならなかったので、情報共有します。
INDEX
SSL化の動機
時間ができたので、Let's Encryptの検証もかねてサーバーのSSLの自動化をやろうと思い始めました。Let's Encryptについてはまた今度じっくり書きますが、凄く乱暴に一言で表現すると「サーバのSSL化を無償でできるお得な証明書」です。動機が分かったところで、変更したところを書いて行きます。そんな多くないです。
管理画面から一般設定を変更
まずはWordPress全体のアドレス (home_urlなど) を変更するためにWordPressの管理画面にログインして、「設定」→「一般」の順に進みます。
WordPressとサイトアドレスの違いですが、これは、サーバーに設定したドメインはここのディレクトリ(フォルダ)を指しますよと教えてあげる設定(DocumentRoot)より下層にWordPressを配置した場合に、意味を成します。複数のWebサイトを同じドメインでいくつも運用していたりする場合に必要かもしれません。もう少し詳細に説明させてください。
WordPressアドレスとサイトアドレスが別の入力値になる例
## サーバーのパス
/var/www/html/ <= hogepiyo.com がこの階層に紐づけてある場合WordPressは
/var/www/html/wp <= WordPressは/var/www/html/より下の階層にインストールされます
## ブラウザに入力するURLは下記になります。
https://hogepiyo.com/wp
WordPressアドレスとサイトアドレスが同じ入力値になる例
## サーバーのパス
/var/www/html/wp <= hogepiyo.com がこの階層に紐づけてある場合WordPressは
## ブラウザに入力するURLは下記になります。
https://hogepiyo.com/
WordPressシングルページ内の画像タグ内src属性のurl変更
さっきの変更で、メディアのURLとか、テーマ内で利用しているhome_url、site_url関数のhttpがhttpsになり、直でURL記入していない限り、大抵のhttpがhttpsに置き換わりました…。が、すでに投稿した記事の画像タグ内src属性のurlは置き換わらないんですね。この為にプラグイン入れるのも面倒なので、ここからは、DB内のデータを置換していきましょう。
postsテーブルのpost_content項目を更新する
WordPressの**_postsテーブルのpost_content項目って何が入っているのかというと、記事の内容が入っています。この項目内のhttpをhttpsに変更するという作業を行っていきます。
作業前にDBのリレーションを確認しておくと良いかもしれません。DB設計資料はWikiでですが公開されているので、今後の為にも一旦見ておきましょう。で、この作業はちょっと危険なので、注意書きしておきます。バックアップは必ず取りましょう。私は「ツール」→「エクスポート」で行いました。
この先DB内のデータ一括置換を行いますので、バックアップは必ず取得してください。私は成功し、この通り行えば再現は可能だと思われますが、更新したデータ件数は1000件程度と小数でした。状況が異なれば、リスクも異なりますので、自己の裁量の元、注意深く作業の実施をしてください。もし、DBやWordPressに関しての知見が浅い場合、外部に依頼するなどしてください。事故が起こった場合、当方で責任を負うことはできません。
SQL実行前に、mysqlのSAFE_UPDATESを解除します
WorkBenchを利用して、mysqlでデータ更新を一括で行おうとすると、主キーが含まれていない場合、下記のようなエラーが出ます。 phpmyadminでは出ないかもしれません。
Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.
From WorkBench
WorkBenchの画面を操作して、設定変更する方法もありますが、SQLで設定変更できます。phpmyadminで出るかどうかは謎です。下記を実行すれば、セーフモードの解除ができます。SQLでセーフモードを解除する場合は、接続が切れると、またONになりますが、画面操作でセーフモードを解除すると、接続がキレても戻らないので留意ください。
SET SQL_SAFE_UPDATES=0; # セーフモードOFF
httpをhttpsに変更するためのSQLを実行する
update文を書くときは、不要なデータの更新を防ぐために、where句を必ず書くようにしましょう。とはいいつつ、自分のwhere句が良いのかどうか分からないので、条件足りないのではと感じたら、書き足すようにしてください。
# いったん変更分が正しいか結果を見て確認
SELECT
ID, post_title, post_content
FROM
wordpress.wp_posts #データベース名.接頭地_posts
WHERE
post_content LIKE '%http%';
問題がなければ、更新していきましょう。
# さっき出たデータのpost_contentのhttpがhttpsに置き換わります。
# 投稿内のimgに限定していないので、投稿内のすべてのhttpがhttpsに置き換わります
# どうしてもhttpを投稿内に残さなければならない場合、違うwhere句を書く必要があります。
UPDATE wordpress.wp_posts #データベース名.接頭地_posts
SET
post_content = REPLACE(post_content,
'http://',
'https://')
WHERE
post_content LIKE '%http%';
affected Rows matched: *** Changed: *** Warnings: 0 0.125 sec
成功すると、こんなログ出ます。Changedの数を確認して想定通りであれば、さっきのSELECTのSQLを確認して、変更されたかどうか確認してみると良いと思われます。
テーマのカスタマイズ
Widgetやテーマ固有設定で画像を利用するところがある場合、該当箇所のhttpをhttpsに変更したら自分は完了しました。何故完了と思ったのかというと、TOPページのURL(Chorome)鍵マークが出たからになります。
以上です。お疲れ様でした!