apacheでmod_rewrite+Basic認証時に特定パスのみ認証を解除する

簡単そうに見えて大ハマリした。
ちなみに特定パスのみ認証をかけるのであれば
Cakephpで任意のコントローラにBASIC認証をApache側でかける - cakephperの日記(CakePHP, Laravel, PHP)
でいけそう(未確認)だが、同じ手法ではこちらはダメでした。

要件

全体にBasic認証かかってるCakePHPアプリの特定コントローラへのリクエストのみBasic認証を解除する。
理由はリソース類にもかかってると1リクエストで何回も認証走ってうざいから。

状況

rewriteのパスであれば特定コントローラ=パスをhogeとすると


    Satisfy Any

で、おk。
だが、CakePHPはwebrootディレクトリ以下へのリクエストを全てmod_rewrite
webroot/index.php?url=〜
という形式にrewriteしてしまうから、効かなかった。

仮説1

存在しないが、hogeという名前のダミーフォルダ作って.htaccess

    Satisfy Any

だけ書けば、リクエストされたディレクト.htaccessが上位より優先されるから効くんじゃね?

ダメ

仮説2

仮説1がボツなので、rewriteした結果に対してSatisfy Anyかければいいんじゃね?
GETパラメータのurl以下に対して、正規表現が使えればよいかと思って探すけど、LocationMatch,FilesMatch,Directory…とそれらしきものは見つからず。

rewriteルールで無理やり判定可能にしよう

index.phpのコピーindexNoAuth.phpを作成し/hoge〜のときだけindexNoAuth.phpにリクエストが行くように修正、その上で、Files指定で認証解除する。


    Satisfy Any


ダメ

解決方法1

上記2対策を両方行うと解除された。

解決方法2

仮説1ではダミーフォルダを作成しているが、「状況」で書いたLocationMatchでも可だった。設定の簡便さからこちらを採用。

まとめ

状況から「rewrite前、rewrite後両方のどちらか一方でもBasic認証が有効になればBasic認証がかかる」という理由だと思われる。
前か後のどっちかで判定していると信じ込んでたので、この発想に至るまですごい時間がかかりました…
ちなみにCake側でBasic認証をかけるという方法も見かけたが、管理大変そうなので不採用にしました。
http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=1796&forum=3
「仮説2」の解決方法がいかにも無理やりなのでもっとスマートな対策法やもっと詳細な理由等わかる方がいたらコメント頂けると嬉しいです!

  • 追記

なぜかタイトルが消えていたので修正しました

  • 追記2

問題点があったので、apacheでmod_rewrite+Basic認証時に特定パスのみ認証を解除するの注意事項 - 凡人プログラマで報告。