[WordPress] 管理側へアクセスできない

前提

環境 Ver.
OS Amazon Linux AMI 2017.03.1.20170812 x86_64 HVM GP2
WordPress 4.5.3
Apache 2.4
MySQL 5.7
PHP 7.0
EC2 type t2.micro

調査

ログを確認。
リダイレクトが掛かっている模様。

/var/log/httpd/access_log

10.0.9.222 - example [30/Jun/2019:09:43:46 +0900] "GET /example/wp-admin/ HTTP/1.0" 302 - "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3000.000 Safari/509.00"

htaccessを確認する。

/path/to/wp-admin/.htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

# Basic Auth
AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /var/www/vhosts/example/htdocs/example/wp-admin/.htpasswd
AuthGroupfile /dev/null
require valid-user

# .htaccessと.htpasswdをアクセス不可に。
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

# admin-ajax.phpはプラグインで利用する可能性があるので、除外。
<FilesMatch "(admin-ajax.php)$">
    Satisfy Any
    Order allow,deny
    Allow from all
    Deny from none
</FilesMatch>

キャッシュ系プラグインのフォルダを消す、または名称変更を行う。

$ cd /wp-content/cache/comet-cache/cache/http/
$ mv www.example.com www.example.com.bak

WordPressでキャッシュ系プラグインを無効化する。
wp-content/plugins/ 配下にある該当のプラグイン名を変更する。

※一時的な処置の為、後で元に戻す。

$ mv xxx xxx.bak

DBの”wp_options”テーブルにある”home”と”siteurl”を確認する。
->なぜか”siteurl”だけ、httpsがついている為、修正する。

mysql> SELECT * FROM wp_options WHERE option_name IN ('home','siteurl');
+-----------+-------------+-----------------------------------+----------+
| option_id | option_name | option_value                      | autoload |
+-----------+-------------+-----------------------------------+----------+
|         2 | home        | http://www.example.net/ | yes      |
|         1 | siteurl     | https://www.example.net/| yes      |
+-----------+-------------+-----------------------------------+----------+
2 rows in set (0.01 sec)

mysql> UPDATE wp_options SET option_value = 'http://www.example.net/' where option_name IN ('home','siteurl');
Query OK, 1 row affected (0.03 sec)
Rows matched: 2  Changed: 1  Warnings: 0

mysql> SELECT * FROM wp_options WHERE option_name IN ('home','siteurl');
+-----------+-------------+----------------------------------+----------+
| option_id | option_name | option_value                     | autoload |
+-----------+-------------+----------------------------------+----------+
|         2 | home        | http://www.example.net/ | yes      |
|         1 | siteurl     | http://www.example.net/ | yes      |
+-----------+-------------+----------------------------------+----------+
2 rows in set (0.00 sec)

今回の原因

今回の302リダイレクトは、管理画面側でサイトURLをhttpからhttpsへ変更したことによるリダイレクトであった。

リバースプロキシ配下でWordpressへアクセスさせている場合、管理画面のリンクが正しくない場合がある。
リバースプロキシ経由でWordpressへアクセスされている場合、 $_SERVER['HTTP_HOST'] がプロキシサーバー側を見てしまい、管理画面のリンク先などが正常に取得できない場合がある。

そのような場合、 “wp-config.php”へ以下を追記する。

$_SERVER['HTTP_HOST'] = $_SERVER['HTTP_X_FORWARDED_HOST'];
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];