WordPressのSSL化で無限ループ

表題の通り。ここではないとあるWordPressのサイトをSSL化した時にハマった。

■ 環境

  • WordPress 4.9.2
  • Amazon Linux
  • EC2
  • ELB

■ WordPress

設定 > 一般』にある下記2つの項目をSSLに設定した。ちなみにSSLはELBで終端とし、EC2へは”http“でアクセスしたい。

  • WordPressアドレス
  • サイトアドレス

どちらも、もともとある設定の”http“を”https“に変更した。”サイトアドレス“の変更時点では問題がなかったのだが、”WordPressアドレス“を”https“に変更したところ無限ループとなってしまった。

原因は、WordPressのPHPでは”https“でアクセスが来るはずと認識しているのに、実際にはELBで終端されているので”http“でアクセスが来てしまっているため、再度”https“にリダイレクトされている…という感じがする。

というわけで下記を”wp-config.php“に入れることで対応が可能であった。

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
    $_SERVER['HTTPS'] = 'on';

以上。

DB直接操作でプラグイン無効化

WordPressにおいて表題の通り。

■ 環境

  • WordPress 4.8.1

■ きっかけ

先日WordPressのとあるプラグインをアップデートしたタイミングでアクセスが不安定になった。「DB接続エラー」的なものが表示されていたのでDBが落ちたのかと思ったのだが、DB自体は正常に稼働しているようであった。500が返っていたのでWebサーバも確認したが特に問題はなさそう。となるとプラグインをアップデートしたのが原因としか考えられなかった。

しかし管理画面にもアクセスできない状態ではプラグインを停止することもできない。ファイルを消してしまえば良いのかもしれないが、それだとDBとの整合性が合わなくて別のエラーになりかねない。というわけでDBの値を直接操作することにした。

■ MySQL

MySQLで接続し、”wp_options“テーブルの下記行を確認した。

mysql> select * from wp_options where option_name = 'active_plugins' \G
*************************** 1. row ***************************
   option_id: 33
 option_name: active_plugins
option_value: a:13:{i:0;s:27:"xx1/xx1.php";i:1;s:34:"xx2/xx2.php";i:2;s:43:"xx3/xx3.php";i:3;s:55:"...
    autoload: yes
1 row in set (0.00 sec)

mysql&gt

上記のように”serialize“されたデータが入っていた。この”option_value“を空にしたところ正常にアクセスできるようになった。

もちろんプラグインは全て無効になっているので、アップデートして問題のあったもの以外のプラグインを再度有効化しておいた。

以上。