1
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

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

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 can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
1
Help us understand the problem. What are the problem?