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 の名前を変えて制限を外す

関連記事

お気軽にご相談ください

お見積りへ お問い合わせへ
▲