ページごと、あるいはディレクトリごとにベーシック認証をかけたい時に、.htaccessでの設定よりもPHPでやった方が簡単だと思います。
以下のやり方で、PHPでのベーシック認証と、私が体験したエラーと対策を記録します。
認証画面の表示と入力の受取り、そして照合
記述する手順は以下の通りです。
もしユーザーとパスの入力が、指定の文字でない場合、認証画面を表示させ、
指定の文字であった場合、htmlの内容を表示させる。
ソースコードにすると下記のようになります。
if($_SERVER['PHP_AUTH_USER']!=="user" || $_SERVER['PHP_AUTH_PW']!=="password"){
header("www-Authenticate: Basic realm=\"This Page is Member Only\"");
header("HTTP/1.0 401 Unauthorized");
}elseif($_SERVER['PHP_AUTH_USER']=="user" && $_SERVER['PHP_AUTH_PW']=="password"){
//ここにHTML
}
分解していくとこのようになります。
if($_SERVER['PHP_AUTH_USER']!=="user" || $_SERVER['PHP_AUTH_PW']!=="password"){
$_SERVER[‘PHP_AUTH_USER’] は認証画面のID部分の入力
$_SERVER[‘PHP_AUTH_PW’]は認証画面のパスワード部分の入力です。
これらのどちらかが、指定の文字でない場合、次のコードで認証画面を出します。
header("www-Authenticate: Basic realm=\"This Page is Member Only\"");
header("HTTP/1.0 401 Unauthorized");
このheader関数で認証画面を出すことができます。realm属性の中が、認証画面上のメッセージテキストになります。realm属性は””で囲む必要がありますが、header関数の””と重複してエラーになるため、\でエスケープしています。
elseif($_SERVER['PHP_AUTH_USER']=="user" && $_SERVER['PHP_AUTH_PW']=="password")
あとは、IDとパスワードが“どちらも”指定の文字と適合していれば、HTMLを表示させるだけです。
ポイントは、エラーのときはIDどパスの“どちらかが”間違っていれば表示させないため、||(あるいは)でIDとパスの認証を区切ります。
適合のときは、&&(なおかつ)でIDとパス両方適合の場合のみを通します。
書き方は様々にあると思いますが、私はこうしました。
認証画面に入力してもまた認証画面が出てしまう場合
これは私が陥ったエラーです。
結論としては、Xserverやサクラインターネットのサーバのデフォルト設定では、この方法で出す認証画面のIDとパスワードが記録されないため、何度入力しても“空”として扱われてしまうためです。
解決方法は、.htaccessにこの3行を書くことです。
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
これで解決するはずです。ぜひお試しください。