毎日スパムコメントを捨てています、自宅プログラマです。
さくらのレンタルサーバーってCGI版PHPなんで、CakePHPの認証モジュールを使えないんですよねー。そういうわけで、apacheでBASIC認証かけていました。最初の.htaccessはこうです。
1 2 3 4 5 6 7 8 9 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule> AuthUserFile /bakeratta/.htpasswd AuthName "BASIC Authorize" AuthType Basic require valid-user |
AuthUserFileは自分で作ってくださいね。bakerattaというのはfoobarやhogeと同じようなメタ構文変数ってやつです。
How to make Basic Auth exclude a rewritten URL
をみて
1 2 3 4 5 6 7 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_URI} ^/medicine/ RewriteRule .* - [E=noauth:1] RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule> |
をやるとmedicine以下の時だけ$_SERVER[‘REDIRECT_noauth’]という変数ができてました。$_ENVにも同じものが。なんだ、これ、おもろー。なんでREDIRECT_がつくんだろ。$_SERVER[‘REDIRECT_REDIRECT_noauth’]ってのもできるし。そっか、URLが書き換わるたびにhtaccessを評価するんですね。
って、最初、環境変数がセットされているか確認の仕方が分からず、ここまででかなり苦労しました。呼び出したPHPでphpinfo()を実行すればapacheの一時変数も$_SERVERに入るんで、これで足がかりができました。
んで、それでもうまくいかず、いろいろやっているうちに結局mod_rewriteの環境変数使わなくてもSetEnvIfだけでいけました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L] </IfModule> SetEnvIf Request_URI "/(img|css)/" noauth SetEnvIf Request_URI "^/medicine/supplies" noauth SetEnvIf Request_URI "^/medicine/app/webroot/supplies" noauth SetEnvIf Request_URI "/webroot/index.php" noauth # 2016/03/16 追記 AuthUserFile /bakeratta/.htpasswd AuthName "BASIC Authorize" AuthType Basic require valid-user Satisfy any Order Deny,Allow Deny from all allow from env=noauth |
Satisfy にanyを設定することにより、ユーザー認証だけでなくホスト制限もみてくれるようになります。
これで通常はBASIC認証かけつつ、medicineディレクトリ(と、そこから呼び出されているcss/imgディレクトリ)以下がBASIC認証対象外になりました。
ポイントは、Rewrite書き換え前と書き換え後、2つのURL両方を書いておくことです。
SetEnvIfを使ってBASIC認証解除したいURLを加えていけばいいので分かりいいですね。
## 2016/03/16 追記
img/x.gifのようなファイルをリクエストしているにも関わらずファイルがみつからない404の時にもBASIC認証がでていたので
SetEnvIf Request_URI “/webroot/index.php” noauth
を追記しました。
ファイルがない場合、cakePHPはwebroot/index.phpにリダイレクトするのでここも許可対象に入れたということです。一見すべてのアクセスが許可されたように思えますが、URLが書き換えられる前もチェックされるのでこれでいいのだ!
あと、特定のコントローラだけBASIC認証かける時とかはPHPで処理した方が簡単です。
HappyQuality – [CakePHP][PHP]コンポーネントを利用せずにベーシック認証を実装する