app/Config/core.php の prefix routes 部分に次のように書き、
Configure::write('Routing.prefixes', array('admins', 'editors', 'authors'));
app/Controller/UsersController.php で admins_login() のようなアクションを書くことで、
- http;//example.com/admin/users/login/
にアクセスすると admins_login() アクションを実行するようにできます。プレフィックスルーティングですね。
上記の例の場合、 editors と authors も設定しているので、http;//example.com/editors/users/login/ や http;//example.com/editors/authors/login/ で editors_login() や authors_login() を実行できます。
さてここで、admins には特定の IP アドレス以外からアクセスさせたくない!となったら、どうしたらよいでしょうか?やってみた記録をメモします。
.htaccess で制限すればいいのだろうけど。。。わからないことを整理します
まさか、app/Controller/.htaccess を作成してどうにかできるわけがありません。CakePHP2 のドキュメントルート配下の領域ではないからです。
CakePHP2 のドキュメントルートは、app/webroot です。ではここに置けば、、、と思うのですけれど、それだと http;//example.com 全体にアクセス制限かかってしまいます。
というよりそもそも CakePHP2 でサイト全体にアクセス制限をかける方法すら、わかりません。
というわけで、調べるべきポイントです。
- CakePHP2 のサイト(全体)に .htaccess による IP アドレスのアクセス制限をかける方法
- プレフィックスルーティングをかけたページへ .htaccess による IP アドレスのアクセス制限をかける方法
まず、CakePHP2 のサイト(全体)に .htaccess による IP アドレスのアクセス制限をかける方法
app/webroot/.htaccess にを次のように修正します。
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L] </IfModule>
↓
order deny,allow deny from all allow from 127.0.0.1 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L] </IfModule>
これで、ローカル環境(127.0.0.1)以外からのアクセスが拒否されることを確認しました。ためしに、allow from 127.0.0.1 をコメントなどにして無効化すると、サイト全体にアクセスできなくなります。意外と簡単です。
そもそも app/webroot で何かしようという発想がなかったので、次のページを見つけたときは、意外と思うとともに、すばらしいと感じました。ありがとうございます。参考ページです。
次に、プレフィックスルーティングをかけたページへ .htaccess による IP アドレスのアクセス制限をかける方法
こちらは次のページが参考になりました。CakePHP ベースのオープンソース baserCMS のフォーラムです。
このページの「yosyos > Re: Admin領域へのIPアドレスによるアクセス制限 @ 2011/2/27 9:38」の部分です。もうほどんど答えです。ではどのようにしたか記していきます。
- app/webroot/admins ディレクトリを作成します。
- app/webroot/.htaccess をコピーして先ほどのディレクトリに貼り付けます。つまり、app/webroot/admins/.htaccess を作成します。
- app/webroot/admins/.htaccess を修正します。
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php [QSA,L] </IfModule>
↓
order deny,allow deny from all allow from 127.0.0.1 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ ../index.php?url=admins/$1 [QSA,L] </IfModule>
ポイントは .htaccess の9行目の「?url=admins/$1」を付け加えることですね。これがないと、http;//example.com/admin/users/login/ にアクセスしてもそんなものはありませんっ!と言われて頭を抱えてしまうことになってしまいます。
以上です。これで CakePHP2 サイトの一部分だけに IP アドレス制限をかけることができます。
おわりに
CakeRequest の clientIp または RequestHandlerComponent の getClientIP(この関数は内部で CakeRequest の clientIp を呼んでいるだけでした。CakePHP 2.2.0)でも IP アドレスが取得できるそうです。
しかし、この関数では IP アドレス偽装を看破できない疑惑がちらほら見られましたので他の方法として .htaccess による方法を探ってみました。
「CakePHP2 の プレフィックスルーティングのページに、.htaccess の IP アドレスアクセス制限をかける方法!」への1件の返信
[…] CakePHP2 の プレフィックスルーティングのページに、.htaccess の IP アドレスアクセス制限をかける方法! | oki2a24 では Apache の .htaccess を使う方法をメモしました。今度は、CakePHP2 に備わっ […]