- 背景
ダッシュボードへのアクセスはIPアドレスでの制限を実施していた。今回、特定の固定ページへのアクセスを内部のみに制限する必要が生じたが、ダッシュボードと異なり固定ページは対応する実際のファイルが存在しないので、書き方を変更する必要があった。
組織内のIPアドレスアクセスのみに限定するページを.htaccessで指定してみた。
例として
xxx.yyy.で始まるIPアドレス と zzz.www.で始まるIPアドレスからのアクセスのみ特定の固定ページにアクセスを許可して、それ以外のIPアドレスからのアクセスは許可しない
と例としてしまします。 - .htaccessの配置場所
ディレクトリは下記の構成で、サブディレクトリwpでWordPressにインストールはしているが、
アクセス時にはドキュメントルートで参照できるようにしている。
ドキュメントルート
┃ .htaccess <---(1)
┗━━ wp
┗━━ wp-login.php
.htaccess <--- (2)
既に実施していた管理画面(ダッシュボード)へのログインを制限する設定は(2)に記述
固定ページのアクセス制限は(1) に記述します。
3. .htaccessの設定
設定内容
xxx.yyy.で始まるIPアドレス と zzz.www.で始まるIPアドレスからのアクセスは不可
固定ページのパーマリンクは「noticeforstudents」とする
.htaccess(1)への追記 既存の「# BEGIN WordPress」より前 に記述する
# ---------------------------------------------
# /noticeforstudents/ 固定ページのアクセス制限
# ---------------------------------------------
<IfModule mod_rewrite.c>
RewriteEngine On
# noticeforstudents ページのURIにマッチ
RewriteCond %{REQUEST_URI} ^/noticeforstudents/?$
# 許可するIPアドレス範囲
RewriteCond %{REMOTE_ADDR} !^xxx\.yyy\.
RewriteCond %{REMOTE_ADDR} !^zzz\.www\.
# 許可範囲外は403を返す
RewriteRule ^ - [F,L]
</IfModule>
【条件判定】
・%{REMOTE_ADDR} はアクセス元の IP アドレスが入る変数
・アクセス元が“xxx.yyy”で始まるアドレスかを調べる
・“!”が付いているので「これにマッチしない場合」に成立
・RewriteCondを複数書くとすべての条件が同時に成立した場合のみ下に書いてある RewriteRule が実行される
※ 上記をまとめると、
アクセス元のIPがxxx.yyy.やzzz.www.始まるIP以外は、RewriteRuleを実行
【リライトルール】
・^ → すべてのパスにマッチ(RewriteRule自体の対象。ここではほとんど形だけ)
・- → 「リライト(書き換え)しない」
・[F,L] → フラグ
F → Forbidden (403) を返す
L → これ以上のルールを処理しない(Last)
※ 上記をまとめると条件にマッチしたアクセスを「403 Forbidden」で止める」
4. 複数の固定ページの場合
例えば /noticeforstaff/ という固定ページも同じIP制限したい場合
# noticeforstudents ページのURIにマッチ
RewriteCond %{REQUEST_URI} ^/noticeforstudents/?$
⬇︎ ⬇︎
# noticeforstudents または noticeforstaff にマッチ
RewriteCond %{REQUEST_URI} ^/(noticeforstudents|noticeforstaff)/?$
制御したい固定ページが複数(たくさん)ある場合はディレクトリにまとめると制御しやすい(この方法は現時点で未確認)
固定ページでディレクトリ風のURLにするには
・ 固定ページを作成するときに 親ページを設定
例: 親ページ private、子ページ noticeforstudents → URL は /private/noticeforstudents/ になる
親ページを作らずに直接スラッグを /private/noticeforstudents/ にすることも可能 ただしスラッグ欄には / は使えないので、通常は親ページを作って階層化
ディレクトリ形式のURLにすると、Apacheから見たリクエストパスも /private/noticeforstudents/ になるので .htaccess で
RewriteCond %{REQUEST_URI} ^/private/
と書けば、ディレクトリ配下のすべての固定ページをまとめて制御できます。