htaccessを使って特定パスへのIP制限を実行するのにかなり詰まったので紹介します!
ちなみにApacheは2.4を使用しています。
例えば以下のような例です。
- https://zakki/profile(公開ページ) → 全員アクセス可能
- https://zakki/profile/admin(管理ページ) → 管理者のみアクセス権限を付与
上記のように公開ページと管理ページでアクセス権限を分ける場合は以下のように設定すればOKです。
※Xの部分はIPアドレスです。
<If "%{REQUEST_URI} =~ /admin/">
Require all denied
Require ip xxx.xxx.xxx.xx
</If>
上記のようにifディレクティブを使うことでadminを含むパスへのアクセス制限ができるようになりました。
それでは詳しく解説していきます。
ifディレクティブはapache2.4以降のバージョンしか使えないのでご注意ください。
公式サイトはこちら
詰まった原因
詰まった原因の大きな原因は前提知識が乏しいことはもちろんなんですが、特定パスに特定IPのみにアクセス許可を行うことを紹介している記事を見つけられなかったことが挙げられます。
基本情報をもとに実装するなら以下2つのディレクティブが有力候補にあがりました。
- Location
- LocationMatch
上記を使えば特定パスを含むURLへのアクセス制限をかけることができます。
公式サイトはこちら
なので、「上記のディレクティブを使えば簡単にアクセス制限できるでしょ!」くらいのつもりでいましたが、どれだけ頑張ってもアクセス制限できることはありませんでした。500エラーの嵐です。
例えば以下のような例です。
<LocationMatch ~ "/admin/">
Require all denied
Require ip xxx.xx.x.x
</LocationMatch>
正規表現を修正してみたり、ディレクティブを変えてみたりと試行錯誤しましたが、最終的にはifディレクティブを使うことで落ち着きました。
まとめ
真実はさておきhtaccessにLocationは使えないと紹介しているも記事もありました。
もしLocationを使ってうまく実装できない場合はifディレクティブを使って実装してみてください!