[WordPress] ページごとにIPアドレスによるアクセス制限をかけたい
- あるページへのアクセスを特定のIPアドレスでの接続のときのみに限定したい、というケースがあります
- htaccessでのアクセス制限はディレクトリ単位となるため、このページだけ、このカテゴリーだけ、という指定がしにくいです
- WordPress内のリダイレクト機能を活用することで、プラグインを使わずにページ単位の細かなIP制限をかけることができます
事前準備
- ここで紹介するサンプルコードでは、アクセスをブロックした際に「ipblock」というスラッグ名の固定ページにリダイレクトをかけます
- 事前準備として、「ipblock」というスラッグ名で固定ページを作成しておきます
サンプルコード
function block_access_by_ip() {
if(is_admin()) { return; }
$ip_list = array(
'000.000.000.000',
'000.000.000.000'
);
if(in_array($_SERVER["REMOTE_ADDR"], $ip_list, TRUE)) {
return;
}
if(is_page(array('xxx', 'yyy', 'zzz'))) {
wp_safe_redirect(esc_url(home_url('/ipblock/')));
exit();
}
}
add_action('template_redirect', 'block_access_by_ip', 1);
サンプルコードの解説
$ip_list = array(
'000.000.000.000',
'000.000.000.000'
);
if(in_array($_SERVER["REMOTE_ADDR"], $ip_list, TRUE)) {
return;
}
- IPアドレスのリストを配列に格納し、接続元IPアドレスが格納されている環境変数$_SERVER["REMOTE_ADDR"]のIPアドレスが配列内に存在しているかをin_array関数でチェックします
- 配列にリストアップしたIPアドレスによる接続であるなら、returnで関数を抜けて以降の処理をスキップ(=アクセスを許可)します
if(is_page(array('xxx', 'yyy', 'zzz'))) {
wp_safe_redirect(esc_url(home_url('/ipblock/')));
exit();
}
- ページの判定をしている処理です
- is_page関数を使って、該当するページであるならwp_safe_redirect関数でリダイレクトを行います
- is_category関数など、他のページ判定処理と組み合わせることも可能です
- 判定の結果、制限が必要なページだった場合は「ipblock」というスラッグ名の固定ページにリダイレクトします
特定のページ以外をすべてブロックしたい場合
add_action('template_redirect', 'block_access_by_ip', 1);
- アクセス可能な範囲をより狭めて、特定のページしかアクセスできないようにする場合のサンプルコードです
- ページチェックの判定として、トップページであるか、IP制限時にリダイレクトするページ(ipblock)であるかも判定しています
- トップページの判定は、サイトの作りに左右されないようis_home関数とis_front_page関数を併用しています
- 制限ページ(ipblock)がチェックから漏れると、無限にリダイレクトを繰り返してエラーになってしまいます。ご注意ください
注意事項
- 今回紹介した方法でIPアドレスによるアクセス制限は可能ですが、判定に使用する$_SERVER["REMOTE_ADDR"]が偽装される可能性もあります
- 本当に重要な機密情報は内部ネットワークに置くなど、制限をかける情報の重要度に応じた対応をするようご注意ください
ご質問など受け付けています
記事の中でわかりにくかったところ、もっと知りたかったこと、間違っていることなど、何でもお気軽にご連絡ください。
ご連絡は下記フォームを利用いただくか、ツイッターアカウント@flat8migi宛てでもOKです。