前提|状況
siteguardプラグインを使用していてログインできないという状況が発生しているとします。
そこでプラグインディレクトリ名を変更してプラグイン自体を無効にすることを試みます。
しかしまだログインできないという状況が発生します。
今回はそのような現象が起こる原因と解決策を整理してみます。
結論|ルートディレクトリの.htaccessを変更する
サーバのルートディレクトリ(wp-contentなどがあるディレクトリ)にある.htaccessをダウンロードしてvscodeなどで開いてみました。すると以下のような記述がありました。
#SITEGUARD_PLUGIN_SETTINGS_START
#==== SITEGUARD_ADMIN_FILTER_SETTINGS_START
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^404-siteguard - [L]
RewriteRule ^wp-admin/css - [L]
RewriteRule ^wp-admin/images - [L]
RewriteRule ^wp-admin/admin-ajax\.php - [L]
RewriteRule ^wp-admin/load-styles\.php - [L]
RewriteRule ^wp-admin/site-health\.php - [L]
RewriteCond %{REMOTE_ADDR} !^xxx\.x\.xxx\.xxx$
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{REMOTE_ADDR} !^::1$
RewriteRule ^wp-admin 404-siteguard [L]
</IfModule>
#==== SITEGUARD_ADMIN_FILTER_SETTINGS_END
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_START
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteBase /
RewriteRule ^wp-signup\.php 404-siteguard [L]
RewriteRule ^wp-activate\.php 404-siteguard [L]
RewriteRule ^login_xxxxx(.*)$ wp-login.php$1 [L]
</IfModule>
#==== SITEGUARD_RENAME_LOGIN_SETTINGS_END
#SITEGUARD_PLUGIN_SETTINGS_END
この中で注目したいのは以下の行になります。
#==== SITEGUARD_ADMIN_FILTER_SETTINGS_START
から
#==== SITEGUARD_ADMIN_FILTER_SETTINGS_END
ここの中の以下の行に注目してみましょう。
RewriteCond %{REMOTE_ADDR} !^xxx\.x\.xxx\.xxx$
このxは実際には数値が入っています。そしてこれは前回ログインしたIPアドレスを記録しているようです。
ログインできるようにするには?|対処方法
前述のSITEGUARD_ADMIN_FILTER_SETTINGS_STARTからSITEGUARD_ADMIN_FILTER_SETTINGS_ENDを削除して保存し、再度サーバにアップロードしてみます。
するとログイン処理が成功します。
そもそも.htaccessとはなんなのか?
apacheというサーバソフトウェアの設定ファイルになります。このファイルに設定することでサーバの挙動を変えることができます。例えばWordPress自身もデフォルトで以下の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
以下に解説付きの例を示します。
# シャープはコメントアウトを意味します。
# BEGIN WordPress
# mod_rewriteはURLを書き換えるapacheのモジュール(部品)です。WordPressのパーマリンク機能に使われています。
<IfModule mod_rewrite.c>
# RewriteEngine OnでURL書き換えを有効にしています。
RewriteEngine On
# RewriteBaseは基準となるパスを指定しており、ここではドキュメントルート(このhtaccessがある場所)を指定しています。
RewriteBase /
# ^index\.php$ - [L]は「index.php」に完全一致するリクエストは何もしない([L]の部分)ということを指定しています。
RewriteRule ^index\.php$ - [L]
# この2行は実在しないファイル(!-fの部分)やディレクトリ(!-d)へのリクエストがあった際に次のリライトルールを適用するということを指定しています。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 以下の行で全てのリクエストはWordPressに処理させるという指定をしています。この前の2行で設定された存在しないファイルやディレクトリへのリクエストがあった場合にこの処理が適用されます。
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
改めてsiteguardのhtaccessを見てみる
以下ポイントのみ抜粋して解説を書いてみます。
#以下の6行で以下のパスにリクエストがあった際は何も処理をしないという指定をしています。わかりやすくドメインをつけたurlで例を示します。
# example.com/404-siteguard
# example.com/wp-admin/css
# example.com/wp-admin/images
# example.com/wp-admin/admin-ajax\.php
# example.com/wp-admin/load-styles\.php
# example.com/wp-admin/site-health\.php
RewriteRule ^404-siteguard - [L]
RewriteRule ^wp-admin/css - [L]
RewriteRule ^wp-admin/images - [L]
RewriteRule ^wp-admin/admin-ajax\.php - [L]
RewriteRule ^wp-admin/load-styles\.php - [L]
RewriteRule ^wp-admin/site-health\.php - [L]
#以下の4行で404にするIPを指定しています。xxx\.x\.xxx\.xxxは前回利用したIPが記録されています。自宅でログインした場合はその時のIPがカフェでログインした場合はその時のIPが記録されます。127.0.0.1(IPv4)と::1(IPv6)はループバックアドレスと呼ばれ自分自身を指すIPアドレスです。REMOTE_ADDRにはユーザーのIPが入りこれらのアドレスと比較して一致したら最後の行の処理を返すという流れになります。
RewriteCond %{REMOTE_ADDR} !^xxx\.x\.xxx\.xxx$
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteCond %{REMOTE_ADDR} !^::1$
#上記4行で指定されたIPと一致した場合wp-adminへリダイレクトしつつ404を返すという処理になります。
RewriteRule ^wp-admin 404-siteguard [L]
プラグインディレクトリ名変更が効かない理由
今回編集していたhtaccessはapacheというサーバの挙動を変えるもの、つまりapacheの設定ファイルになります。apacheの上でWordPressが動いているのでapacheはWordPressよりも前の段階で処理が走るというイメージです。なのでプラグインディレクトリを変えても影響なくリダイレクト処理が完了していたんですね。
コメント