普通の掛け方
.htaccess
AuthType Basic
AuthName "Input ID and Password."
AuthUserFile フルパス/.htpasswd
require valid-user
.htpasswd
basic認証作成サイトで作成する。
こんな感じになる
hoge:fsdfasb23dfas%#"#FD
参考:こんなのもある
.htaccess
# 絶対パスで設定
AuthUserFile /usr/home/hoge/html/app/.htpasswd
# アクセスできるユーザーをグループ分けする時に指定。特になければ↓のように
AuthGroupFile /dev/null
# 表示するメッセージ
AuthName "Protected Area"
AuthType Basic
# GET POST しか受け付けない。→ IDPW が正しいかつ GET POST のどちらか でないとNG
<Limit GET POST>
# htpasswdに複数記述がある場合でさらに制限したい場合に使う。特にない場合は↓のように書く。
require valid-user
</Limit>
特定のディレクトリだけかける
<Directory "D:/pg/Apache/Apache24/htdocs/private"> # かけたいディレクトリ
AuthType Basic
AuthName "Input ID and Password."
AuthBasicProvider file
AuthUserFile D:/pg/Apache/Apache24/password/passwords
</Directory>
↑これではできない。
<Directory>
が.htaccessでは使えないことが多い。
Apacheの設定ファイルで記述するなら行ける。
↓これが正解。
Satisfy Any
AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /var/www/.htpasswd
require valid-user
SetEnvIf Request_URI "/member/" secure_dir
Order Allow,Deny
Allow from all
Deny from env=secure_dir
特定のファイルを除外する
<FilesMatch "(cominsoon\.php)$"> # ここをファイル名にする
Satisfy Any
Order allow,deny
Allow from all
Deny from none
</FilesMatch>
ブラウザから対象ファイルにアクセスできないようにする
<Files ~ "^.(htpasswd|htaccess)$">
deny from all
</Files>
ハマった事例
複数の異なるディレクトリに対してそれぞれ異なるIDPWでかけたい
以下のどちらかで統一しないと期待通り動かない。
- ドキュメントルート直下で上記のSetEnvIfを使った方法で複数の異なるディレクトリにかけるように設定する。(※Apache2.4以上でないとできない。)
or
- 各ディレクトリの中にhtaccessとhtpasswdのセットを置いて設定する(htpasswdは本来ドキュメントルート以外に配置するが一旦はこういう認識で)
異なるディレクトリに異なる認証がかかっている時に、どちらかの認証を通るともう片方も認証が通ってしまう
異なる認証領域名を使用してないことが原因。
AuthName で指定する認証領域名(realm)を異なるものにすることで、ブラウザに異なる認証セッションとして認識させることができる。これにより、一方の認証が他方に影響を与えることを防げる(場合もある)みたい。