CakePHP2 の プレフィックスルーティングのページに、.htaccess の IP アドレスアクセス制限をかける方法!

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」の部分です。もうほどんど答えです。ではどのようにしたか記していきます。

  1. app/webroot/admins ディレクトリを作成します。
  2. app/webroot/.htaccess をコピーして先ほどのディレクトリに貼り付けます。つまり、app/webroot/admins/.htaccess を作成します
  3. 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 による方法を探ってみました。

ディスカッションに参加

1件のコメント

コメントを残す

コメントを残す