Apache だと、.htaccess に記述する方法があります。詳しくは以下の記事にて
さて、Nginx で PHP (php-fpm) な Concrete CMS (concrete5) の場合はどうでしょうか?
Nginx だと Conf に直接書き込む必要があり root 権限が必要です。
僕がよく使っている Config は Ansible にまとめてあります。
https://github.com/concrete5cojp/ansible-c5-ma/
Nginx はこちら: nginx templateディレクトリににまとめてあります
以下がサンプルです。
簡単に言うと、 $basic_auth 変数に off か on を location に応じて代入して、server の最後で basic auth の有効・無効にすると言う方法です。
server {
# 省略
## server_name やログなど
## サブディレクトリの場合は location や rewrite 部分のパスを書き換えるのを忘れずに
## 基本は Basic 認証オフなので、変数のデフォをオフに設定
set $auth_basic off
## ここで /login 配下は on に設定
## サブディレクトリに存在していたら適宜変えてください
location ^~ /login {
set $auth_basic on
index index.php index.html index.htm;
if (!-e $request_filename) {
rewrite ^ /index.php last;
}
}
# 省略
# php-fpm に送る記述
## 他の表記にしているのなら合わせてください。パスの変更なども忘れずに。
location ~ \.php($|/) {
## 省略
}
# Basic 認証設定
## .htpasswd の保存場所が違ったら書き換えてください
auth_basic $auth_basic;
auth_basic_user_file /var/www/html/.htpasswd;
}
Nginx の記述方法は、多種多様だとおもいますので適宜変更してください。
より技術的な解説
Concrete CMS や WordPress など、 .php 拡張子を隠して、URLクエリを、 URL そのものに見せる方法をとっているアプリがたくさんあります。
location に応じて変数を設定し、Nginx の Server の最後に Basic Auth の設定を加えることで、 rewrite や try_files (本 config は書いてないですが) などで .php が呼び出されたとしても大丈夫です。
まず location のところで変数が設定され、 最後 Basic Auth の部分に渡り、Basic Auth 有効・無効になる仕組みです。
fastcgi キャッシュを有効・無効にしたり、ロードバランサーや監視サーバーの Ping をログに残さないようにしたりと、 Nginx の if と変数を使って試行錯誤した結果でこうなりました。
この方法を使って、auth_basic_user_file
部分も変数化し、特定の URL だけ別の ID・PW を設定するなんて芸当もできます。
以上