プラグインのみで WordPress の http から https へのリダイレクトの検証

WordPress のSSL化については、普段は WP-CLI でサイトURLも一括置換をかけてしまうのですが、プラグインだけでできないか、と考えたので検証します。

1. FTP (vsftpd)

1.1. ユーザ追加

# useradd despite
# passwd despite

ユーザを追加します。

ユーザ制限

# vi /etc/vsftpd/user_list

despite

FTPユーザとして認識させます。

# vi /etc/vsftpd/user_conf/despite

local_root=/var/www/thesewords

ドキュメントルート設定。

# systemctl reload vsftpd
#

OK。

2. 仮想サイト作成

2.1. ディレクトリ作成

# mkdir /var/www/thesewords
# mkdir /var/www/thesewords/web
# chown -R despite:despite /var/www/thesewords/web

3.2. Webmin で仮想サイト作成

  • 仮想ホストの作成
    • アドレス: XXX.XXX.XXX.XXX
    • ポート: 80
    • ドキュメントのルート: /var/www/thesewords/web
    • サーバ名: express.example.jp
    • 仮想サーバの追加: 選択したファイル: /etc/httpd/conf.d/thesewords.conf
    • ディレクティブのコピー元: どこにもない

ディレクティブ

DocumentRoot "/var/www/thesewords/web"
ServerName express.example.jp
<Directory "/var/www/thesewords/web">
allow from all
AllowOverride All
Options FollowSymLinks
Require all granted
</Directory>

3. Let’s Encrypt

# certbot
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: express.example.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for express.example.jp
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/httpd/conf.d/thesewords-le-ssl.conf
Deploying Certificate to VirtualHost /etc/httpd/conf.d/thesewords-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://express.example.jp

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=express.example.jp
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/express.example.jp/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/express.example.jp/privkey.pem
   Your cert will expire on 2021-01-29. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

OK。あえてリダイレクトなしに設定。

4. MuSQL

  • DB作成: example_wpdb
    • 文字コード: utf8mb4_0900_ai_ci
    • 照合順序: utf8mb4_ja_0900_as_cs_ks
  • ユーザ作成: example_wpdb_user
    • 許可なし。 example_wpdb に対しての許可だけ与える

5.ex. MySQL 8 の不具合対処

ユーザを保存できませんでした : SQL set password for ‘example_wpdb_user’@’HOSTNAME’ = password(‘XXXXXXXXXXXX’) が失敗しました: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘password(‘XXXXXXXXXXXX’)’ at line 1

ユーザ作成時に怒られました。

# mysql -u root -p

mysql> set password for 'example_wpdb_user'@'HOSTNAME' = 'XXXXXXXXXXXX';
Query OK, 0 rows affected (0.10 sec)

mysql> alter user 'example_wpdb_user'@'HOSTNAME' identified with mysql_native_password by 'XXXXXXXXXXXX';
Query OK, 0 rows affected (0.12 sec)

mysql> SELECT host,user,plugin FROM mysql.user where user='example_wpdb_user';
+-----------+------------------+-----------------------+
| host      | user             | plugin                |
+-----------+------------------+-----------------------+
| HOSTNAME | example_wpdb_user | mysql_native_password |
+-----------+------------------+-----------------------+
1 row in set (0.00 sec)

mysql> quit;
Bye

この通りにパスワード変更、保存形式変更、確認してOK。

6. WordPress 引っ越し

手元に適当なサンプルがなかったので以前作成したものを試しに引っ越してみます。

WordPress サンプルサイト
WordPress サンプルサイト

6.1. エクスポート

まずサンプルサイトのデータをエクスポートします。

ファイルはダウンロード、DBは Webmin からバックアップで実施。

6.2. wp-config.php の編集

DB を変更するので wp-config.php を編集します。

// 略

/** WordPress のためのデータベース名 */
define('DB_NAME', 'old_db');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'old_user');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'old_password');

/** MySQL のホスト名 */
define('DB_HOST', 'HOSTNAME');

/** データベースのテーブルを作成する際のデータベースのキャラクターセット */
define('DB_CHARSET', 'utf8');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');

// 略

これを

// 略

/** WordPress のためのデータベース名 */
define('DB_NAME', 'example_wpdb');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'example_wpdb_user');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'new_password');

/** MySQL のホスト名 */
define('DB_HOST', 'HOSTNAME');

/** データベースのテーブルを作成する際のデータベースのキャラクターセット */
define('DB_CHARSET', 'utf8');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');

// 略

こう。

それから、https://api.wordpress.org/secret-key/1.1/salt/でソルトを変更しておきます。

6.3. ファイルアップロード

# usermod -aG wheel,apache despite
# chown -R apache:apache /var/www/thesewords/web
# find /var/www/thesewords/web/ -type f -exec chmod 664 {} \;
# find /var/www/thesewords/web/ -type d -exec chmod 775 {} \;

ファイルアップロードする前に上を実施。

# chown -R apache:apache /var/www/thesewords/web
# find /var/www/thesewords/web/ -type f -exec chmod 664 {} \;
# find /var/www/thesewords/web/ -type d -exec chmod 775 {} \;

ファイル・ディレクトリに対してもう一度。

# chmod 400 /var/www/thesewords/web/wp-config.php

wp-config.php だけ別設定。

6.4. SQL をインポート

phpMyAdmin から SQL ファイルをインポート。

インポート完了
インポート完了

6.ex. URL 一括置換

WP-CLI で一括置換。ただしこれはSSL化のためではなく、URL変更のためです。そのため、あえてhttp始まりに置換しています。

# wp search-replace --recurse-objects 'https://hoge.example.jp/piyo/fuga' 'http://hogera.example.jp' --allow-root
+------------------+-----------------------+--------------+------+
| Table            | Column                | Replacements | Type |
+------------------+-----------------------+--------------+------+
| wp_commentmeta   | meta_key              | 0            | SQL  |
| wp_commentmeta   | meta_value            | 0            | SQL  |
| wp_comments      | comment_author        | 0            | SQL  |
| wp_comments      | comment_author_email  | 0            | SQL  |
| wp_comments      | comment_author_url    | 0            | SQL  |
| wp_comments      | comment_author_IP     | 0            | SQL  |
| wp_comments      | comment_content       | 0            | SQL  |
| wp_comments      | comment_approved      | 0            | SQL  |
| wp_comments      | comment_agent         | 0            | SQL  |
| wp_comments      | comment_type          | 0            | SQL  |
| wp_links         | link_url              | 0            | SQL  |
| wp_links         | link_name             | 0            | SQL  |
| wp_links         | link_image            | 0            | SQL  |
| wp_links         | link_target           | 0            | SQL  |
| wp_links         | link_description      | 0            | SQL  |
| wp_links         | link_visible          | 0            | SQL  |
| wp_links         | link_rel              | 0            | SQL  |
| wp_links         | link_notes            | 0            | SQL  |
| wp_links         | link_rss              | 0            | SQL  |
| wp_options       | option_name           | 0            | SQL  |
| wp_options       | option_value          | 3            | PHP  |
| wp_options       | autoload              | 0            | SQL  |
| wp_postmeta      | meta_key              | 0            | SQL  |
| wp_postmeta      | meta_value            | 0            | PHP  |
| wp_posts         | post_content          | 5            | SQL  |
| wp_posts         | post_title            | 0            | SQL  |
| wp_posts         | post_excerpt          | 0            | SQL  |
| wp_posts         | post_status           | 0            | SQL  |
| wp_posts         | comment_status        | 0            | SQL  |
| wp_posts         | ping_status           | 0            | SQL  |
| wp_posts         | post_password         | 0            | SQL  |
| wp_posts         | post_name             | 0            | SQL  |
| wp_posts         | to_ping               | 0            | SQL  |
| wp_posts         | pinged                | 0            | SQL  |
| wp_posts         | post_content_filtered | 0            | SQL  |
| wp_posts         | guid                  | 72           | SQL  |
| wp_posts         | post_type             | 0            | SQL  |
| wp_posts         | post_mime_type        | 0            | SQL  |
| wp_term_taxonomy | taxonomy              | 0            | SQL  |
| wp_term_taxonomy | description           | 0            | SQL  |
| wp_termmeta      | meta_key              | 0            | SQL  |
| wp_termmeta      | meta_value            | 0            | SQL  |
| wp_terms         | name                  | 0            | SQL  |
| wp_terms         | slug                  | 0            | SQL  |
| wp_usermeta      | meta_key              | 0            | SQL  |
| wp_usermeta      | meta_value            | 0            | PHP  |
| wp_users         | user_login            | 0            | SQL  |
| wp_users         | user_nicename         | 0            | SQL  |
| wp_users         | user_email            | 0            | SQL  |
| wp_users         | user_url              | 0            | SQL  |
| wp_users         | user_activation_key   | 0            | SQL  |
| wp_users         | display_name          | 0            | SQL  |
+------------------+-----------------------+--------------+------+
Success: Made 80 replacements.

OK。

6.ex2. トップページ以外で 500 Internal Server Error

サブディレクトリの WordPress をサブドメインに引っ越しする際は WP-CLI でも .htaccess が置いてけぼりにされる(ディレクトリ指定なのでドメイン指定だと漏れる)ので修正。

6.5. 表示確認

  • トップ、2ページ目、個別記事、カテゴリアーカイブ、年月アーカイブが表示されることを確認
  • ログイン正常
  • 記事をアップ

OKそうです。

7. WordPress SSL化

いよいよ本題。プラグインのみでSSL化かつリダイレクトまでするようにしてみます。

7.1. 動作確認

httpアクセスであることを確認
httpアクセスであることを確認

ページ遷移してhttpアクセスのまま、httpsにリダイレクトされない状況であることを確認。

7.2. 設定

管理画面のプラグイン新規追加で Really Simple SSL を検索
管理画面のプラグイン新規追加で Really Simple SSL を検索

今回は手っ取り早く「Really Simple SSL」を使います。まずは管理画面のプラグイン新規追加で Really Simple SSL を検索。インストールして有効化します。

Really Simple SSL の通知で「はい、SSLを有効化します。」をクリック
Really Simple SSL の通知で「はい、SSLを有効化します。」をクリック

Really Simple SSL の通知で「はい、SSLを有効化します。」をクリックします。

httpsアクセスになることを確認
httpsアクセスになることを確認

httpsアクセスになることを確認。

管理画面の Really Simple SSL の通知
管理画面の Really Simple SSL の通知

再び管理画面にログインします。

管理画面の設定→一般設定
管理画面の設定→一般設定

「設定」→「一般設定」で以下の2つが https 始まりになっていることを確認

  • WordPress アドレス (URL)
  • サイトアドレス (URL)
Really Simple SSL の設定画面で「301 .htaccess リダイレクトを有効化」
Really Simple SSL の設定画面で「301 .htaccess リダイレクトを有効化」

Really Simple SSL の設定画面で「301 .htaccess リダイレクトを有効化」のスイッチをオンにして「保存する」をクリック。

Chrome の Devtools で 301 リダイレクトがかかっていることを確認
Chrome の Devtools で 301 リダイレクトがかかっていることを確認

Chrome の Devtools で 301 リダイレクトがかかっていることを確認できました。OKです。


あれ、プラグインだけでhttp→httpsのリダイレクト設定が済んでしまいましたね……。

参考

WordPress の ソルト

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。