BASIC認証で特定のディレクトリのみ追加認証をつけたい
Basic認証を使用してアクセス制限をかける時に特定のファイルにのみアクセス制限をしたい場合があります。
ディレクトリごとBasic認証をかける場合は「.htaccess」に集約して設置してしまえば事足りるのですが、特定のディレクトリのファイルが対象となるとそうもいかない...
今回は特定のディレクトリのファイルにのみアクセス制限をかけることに成功したので、備忘録として記します。
ファイル構成
今回は、「secret.txt」に対してBasic認証をかけていきます。
以下のような構成を例として挙げます。
tree .
├── .htaccess
├── hoge
│ ├── README.md
│ ├── .htaccess
│ ├── .htpasswd
│ ├── secret.txt
実施したこと(失敗談)
その1 basic認証をかけたいディレクトリに.htaccessファイルの配置
cat .htaccess
AuthUserFile /hoge/.htaccess
AuthName "Enter your password"
AuthType Basic
require valid-user
basic認証をかけたいディレクトリに対象ファイル(.htaccess)を配置するところまでは合っていました。
しかし、上記ファイルの中身だけでは不足でした。(成功談へつづく)
その2 If条件を使う
cat .htaccess
<If true>
AuthUserFile /hoge/.htaccess
AuthName "Enter your password"
AuthType Basic
require valid-user
</true>
ファイルの中身にif条件を追記することで、ディレクトリ内にbasic認証をかけられると記述があったので、実施するも、よくよく現サーバのhttpdバージョンを確認すると2.2だった為、対応していないことが判明。。こりゃいかんと思い、別案を検証
その3 SetEnvIfを使う
cat .htaccess
AuthUserFile /hoge/.htaccess
AuthName "Enter your password"
AuthType Basic
require valid-user
SetEnvIf Request_URI "/hoge/" basic_dir
Order Allow,Deny
Allow from all
Deny from env=basic_dir
上記設定を試してみるも、失敗。
SetEnvIf自体の設定方法をブログなどで確認したのですが、ダメでした。意味を深く理解出来ていなかったのかもしれない。。
実施したこと(成功談)
cat .htaccess
<Files ~ "^\.*">
AuthUserFile /hoge/.htaccess
AuthName "Enter your password"
AuthType Basic
require valid-user
</Files>
上記ファイルの中身を説明すると、
<Files ~ "^\.*"> </Files> : 正規表現でファイルを指定
AuthUserFile : 作成済みのパスワードファイルをフルパスで指定する。
AuthName : 認証画面に表示されるメッセージを書く。半角英数字が良い
AuthType : 認証方式の指定。この場合はbasic認証をしたいのでbasic
require : アクセスを許可するユーザーを指定。ファイルに書いた「valid-user」はパスワードファイルに含まれる全てのユーザーを許可することを意味する
まとめ
まあまあハマってしまった件なので、同じような事象にぶち当たっている人の役に立てれば幸いです。
ファイルの中身をもっとよく調べよう(自戒)
参考資料