2026年5月20日
2026年5月20日
wp-adminを.htaccessでIP制限する方法(Apache 2.4・admin-ajax.php除外)
WordPress の管理画面(/wp-admin/)を、決まった IP アドレスからだけ開けるようにすると、それ以外の接続元からのログイン試行を Web サーバーの段階で止められます。この記事では、Apache の .htaccess で IP アドレス制限をかける手順を、サイトの表側の機能を壊さないための除外設定とあわせて説明します。
設定を間違えると自分も管理画面に入れなくなります。作業の前に、FTP・SFTP かレンタルサーバーのファイルマネージャーで .htaccess を編集できることを確かめておきます。
この方法が使える環境
- Web サーバーが Apache(または
.htaccessを読む LiteSpeed)であること。Nginx は.htaccessを読まないため、この方法は効きません。 .htaccessでRequireを使うには、サーバー側でAllowOverride AuthConfig(またはAll)が許可されている必要があります。許可されていない場所に書くと 500 エラーになります。多くのレンタルサーバーでは許可されています。- 接続元の IP アドレスが変わらないこと(固定 IP、会社の回線、VPN など)。家庭の回線のように IP アドレスが変わる環境では、変わるたびに締め出されます(後述)。
手順1: 自分の IP アドレスを確認する
管理画面を開くパソコンで、次を実行します。ブラウザで IP アドレスを表示するサービスを開いて確かめてもかまいません。
# IPv4 のアドレス
curl -s https://api.ipify.org
# IPv6 で接続している場合の確認(IPv6 が使える回線では IPv6 のアドレスが返る)
curl -s https://api64.ipify.org
回線が IPv6 に対応していると、サーバーへの接続が IPv6 になることがあります。その場合は IPv6 のアドレス(またはそのプレフィックス)も許可しないと 403 になります。
手順2: wp-admin/.htaccess を作って IP アドレスを制限する
wp-admin フォルダーの中に .htaccess を作ります(WordPress 本体には含まれていないファイルです。すでにある場合は中身を確認してから追記します)。Apache 2.4 の書き方は次のとおりです。
# wp-admin/.htaccess
# 許可する IP アドレス(例の値を自分のものに置き換える)
Require ip 203.0.113.10 198.51.100.0/24 2001:db8:1234::/48
# サイトの表側からも呼ばれるファイルは、だれでも開けるようにする
<Files admin-ajax.php>
Require all granted
</Files>
<Files admin-post.php>
Require all granted
</Files>
Require ipには、IP アドレスを空白区切りで並べます。198.51.100.0/24のような CIDR 表記や、IPv6 のアドレスも書けます。admin-ajax.phpは、問い合わせフォームの送信、絞り込み検索、WooCommerce のカート更新など、サイトの表側の機能からも呼ばれます。制限の対象に入れると、これらの機能が動かなくなります。admin-post.phpは、ログインしていない訪問者のフォーム送信を受けるのに使われることがあります(admin_post_nopriv_で始まるフックを使うプラグインなど)。使っていない場合でも、許可しておいて問題は起きにくいファイルです。
Order Deny,Allow・Deny from all・Allow from … という書き方は Apache 2.2 のものです。Apache 2.4 では互換モジュール(mod_access_compat)が有効な場合にだけ動き、Require と混ぜると意図しない結果になりやすいため、新しく書くときは Require を使います。
手順3: wp-login.php も制限する
wp-login.php は wp-admin フォルダーではなく WordPress のルートにあるため、手順2 の設定では守られません。ルートの .htaccess に次を追加します。WordPress が書き換える # BEGIN WordPress 〜 # END WordPress の外(上)に書きます。
# ルートの .htaccess(# BEGIN WordPress より上に書く)
<Files wp-login.php>
Require ip 203.0.113.10 198.51.100.0/24 2001:db8:1234::/48
</Files>
wp-login.php には、パスワードを忘れたときの再設定や、パスワード保護したページの入力も届きます。会員登録やパスワード保護ページを使っているサイトでは、外部の人が使えなくなる点に注意します。
手順4: 動作を確認する
許可していない接続元(スマートフォンのモバイル回線など)から、次の結果になることを確認します。
# 403 Forbidden になること
curl -I https://example.com/wp-admin/
curl -I https://example.com/wp-login.php
# 403 にならないこと(パラメーターなしで開くと WordPress が 400 を返す)
curl -I https://example.com/wp-admin/admin-ajax.php
許可した接続元のブラウザでは、/wp-admin/ を開くといつもどおりログイン画面が表示されることを確認します。あわせて、サイトの表側の問い合わせフォームや検索など、admin-ajax.php を使う機能が動くかも試します。
Cloudflare やリバースプロキシを通している場合
Cloudflare やロードバランサーを通すと、Apache から見た接続元は中継サーバーの IP アドレスになります。このままでは Require ip で自分の IP アドレスを指定しても一致しません。Apache の mod_remoteip で、中継サーバーが渡すヘッダー(Cloudflare の場合は CF-Connecting-IP)から本来の接続元を復元する設定が必要です。レンタルサーバーでは対応状況がサーバー会社ごとに異なるため、管理パネルの説明やサポート情報を確認します。
Cloudflare を使っている場合は、Cloudflare 側のアクセス制御(WAF のカスタムルールや Cloudflare Access)で /wp-admin/ と /wp-login.php を制限する方法もあります。
IP アドレスが変わる環境の場合
接続元の IP アドレスが変わる環境では、IP アドレス制限よりも次の方法が向いています。
- 管理画面に Basic 認証をかける(IP アドレスに関係なく、ID とパスワードで二重に守る)
- VPN を用意し、VPN の出口の IP アドレスだけを許可する
- ログインの試行回数制限や二段階認証を入れる
レンタルサーバーによっては、管理パネルに「国外からの管理画面へのアクセス制限」などの機能があります。.htaccess と重ねて使うと、どちらで止められたのかがわかりにくくなるため、どこに制限を入れたかを記録しておきます。
自分が締め出されたときの戻し方
IP アドレスが変わったり、設定を書き間違えたりして 403 や 500 になった場合は、FTP・SFTP またはファイルマネージャーで次のどちらかを行います。
wp-admin/.htaccessの名前をhtaccess-offなどに変える(制限が外れる)- ルートの
.htaccessに追加した<Files wp-login.php>のブロックを削除する
管理画面に入れたら、今の IP アドレスを確かめて Require ip を書き直し、ファイル名を元に戻します。
まとめ
wp-admin/.htaccessにRequire ipで許可する IP アドレスを書き、admin-ajax.phpとadmin-post.phpはRequire all grantedで除外するwp-login.phpはルートの.htaccessで、# BEGIN WordPressの外に<Files wp-login.php>を書いて制限する- Apache 2.4 では
Order・Allow・DenyではなくRequireで書く - IPv6、Cloudflare などの中継、IP アドレスが変わる回線では、許可する値や方法を見直す
- 締め出されたら FTP などで
.htaccessの名前を変えて制限を外す