Wordpressで管理側へアクセスできない場合の原因調査と解決案

ログを確認する

% less /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を確認する

% vi /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'];