WordPressサイトをリニューアルする際、これまで /sub/
をルートに見せる設定をしていたものを、新しく /sub-new/
をルートに見せる設定に切り替えました。PCでは問題なくログインできたものの、スマホからログインすると403エラーが発生するという不思議な状況に陥りました。

.htaccessに残っていた古いアクセス制御が原因
調査を進めると、原因は .htaccess
に残っていた古いアクセス制御でした。具体的には wp-login.php
へのアクセスを特定のIPだけ許可するルールが残っており、PCは既存セッションで動いていたため気づかず、スマホは新規アクセスだったため403で弾かれていたのです。
<Files wp-login.php>
order deny,allow
Deny from all
Allow from 118.xxx.xxx.xxx
...
</Files>
このルールを削除し、代わりに以下のように「すべて許可」に書き換えたところ、スマホでも正常にログインできるようになりました。
<IfModule mod_authz_core.c>
<Files "wp-login.php">
Require all granted
</Files>
</IfModule>
<IfModule !mod_authz_core.c>
<Files "wp-login.php">
Order allow,deny
Allow from all
</Files>
</IfModule>
キャッシュをクリアした後に再テストすると、PC・スマホともに問題なくログイン可能になり、リニューアル作業を続行できました。
補足:なぜ許可IPでも403だったのか
今回のログを詳しく確認すると、Apacheの access_compat
モジュール経由でエラーが出ていました。これは、Apache 2.2形式(order/deny/allow)と2.4形式(Require)が混在している時に起こる現象です。結果として、上位で「Require all denied」が効いてしまい、許可IPを指定してもスマホからのアクセスがブロックされていた可能性があります。
さらに、スマホやVPNはIPv6でアクセスすることも多く、IPv4の Allow from
にだけ許可を書いても、IPv6ではマッチせず403になるという落とし穴も考えられます。
SiteGuardの影響
今回の .htaccess
の記述は、過去に導入していたセキュリティプラグイン(SiteGuard WP Plugin など)が自動で書き込んだものと思われます。プラグインを削除しても .htaccess
に残骸が残ることがあり、リニューアルやディレクトリ切替の際に思わぬトラブルの元になります。
今回の学び(チェックリスト)
- 既存セッションは信用しない:PCで動いても安心せず、スマホやシークレットモードで必ずログイン確認をする。
- .htaccessを見直す:リニューアルやサブディレクトリ切替時には古いアクセス制御が残っていないか確認する。
- Apache 2.2書式は使わない:
order/deny/allow
は廃止方向。Require ip
に統一する。 - IPv6も考慮する:モバイル回線はIPv6になることが多い。アクセス制御をする場合はIPv4/IPv6両方を記述する。
- セキュリティ対策は別の方法で:IP制限ではなく、Turnstile、reCAPTCHA、二段階認証といった方法が現実的で安全。
- キャッシュを必ずクリア:不具合調査時はサーバーキャッシュとブラウザキャッシュの両方を削除する。
この一件で、リニューアル作業では「表示ができたか」だけでなく「どの端末からでも同じように動くか」を確認することの大切さを改めて実感しました。PCだけでなくスマホ環境での検証を習慣化することが、安定運用への近道だと思います。
関連リンク
