apacheでmod_rewrite+Basic認証時に特定パスのみ認証を解除する
簡単そうに見えて大ハマリした。
ちなみに特定パスのみ認証をかけるのであれば
Cakephpで任意のコントローラにBASIC認証をApache側でかける - cakephperの日記(CakePHP, Laravel, PHP)
でいけそう(未確認)だが、同じ手法ではこちらはダメでした。
状況
非rewriteのパスであれば特定コントローラ=パスをhogeとすると
Satisfy Any
で、おk。
だが、CakePHPはwebrootディレクトリ以下へのリクエストを全てmod_rewriteで
webroot/index.php?url=〜
という形式にrewriteしてしまうから、効かなかった。
仮説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認証時に特定パスのみ認証を解除するの注意事項 - 凡人プログラマで報告。