LoginSignup
1

More than 1 year has passed since last update.

Nginx で特定パスだけ Basic 認証をかける (Concrete CMS ログインページ等)

Last updated at Posted at 2021-08-25

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 を設定するなんて芸当もできます。

以上

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1