Code Igniterで特定ページ以外を403 Forbiddenにする

ちょっとマニアックなオーダーが来たのでメモ程度に。


WebアプリをCode Igniterを使って書かれているサイトがあり
http://Domainname/index.php でユーザページを
http://Domainname/admin/ で管理者ページが開けるパッケージになっている。


そして特定サーバのみ「ユーザーページは開けないようにして、管理者ページだけ開けるようにして欲しい」というオーダー


で、通常のファイル構成であれば、URIが / に403(Deny)を指定して
/admin に対してAllowを指定すれば済むのだけど


Code Igniterに乗っかっているため、/admin のリクエストをWebサーバでRewriteして
/index.phpを呼び、そこから各処理を実行するようになっている。ユーザーページも管理者ページも。





つまり
http://Domainname/ (http://Domainname/index.php)へのリクエストは許さないけど
http://Domainname/index.phpがレスポンスを返さなければならないというもの。


で、こんな感じにしてみた。

<Location "/admin">
  RewriteEngine on
  RewriteCond "忘れた"
  RewriteRule ^(.*)$ /index.php/$1 [L]
</Location>

<Location "/">
  SetEnvIf RequestURI "/admin*" access_ok
  SetEnvIf RequestURI "/image*" access_ok

  Order Allow,Deny
  Allow env=access_ok
  Deny from All
</Location>

Rewrite関連の個所はCodeIgniterの導入で良く書かれているものです。


但しLocationは /admin で指定。
で、 / のLocationではReuestURIを見て、/adminだったら環境変数access_okを定義して
Order句でAllowに行くように指定します。


画像等が別途ディレクトリにあり、それらも表示する必要があればSetEnvIfの行を追加していけばOK。(上記で/imageを追加している箇所)


こうすることで、
http://Domainname/admin へのアクセスを /index.phpが処理して返しつつ
http://Domainname/index.phpのリクエストはOrder Denyに流して403に入っていきます。



Rewriteを使うと、URLを書き換えるけどURIは書き換えないのを利用して
Index.phpのリクエストを判別しています。
その辺りは上記の設定をして、index.phpにphpinfo()を吐かせるとわかると思います。



(;'-')さて、URIルーティングについてインフラ系の方々にどのくらい理解を頂けるものなのかが次の課題ですな。