ラボ > サーバ:.htaccess

.htaccessの記述サンプル(BASIC認証)

ファイル単位だったり、FuelPHPで指定したり・・・諸々。

作成日:2018-04-19, 更新日:2018-10-19

基本

BASIC認証にしたいディレクトリに「.htaccess」のファイルを置く。
「.htaccess」のファイルを置いたディレクトリ内(サブディレクト内も)が対象

AuthUserfile /フルパス/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user

「AuthName」は認証させるときのユーザーへのメッセージであり、IDになる。
※複数個所でBASIC認証させるときに「AuthName」の値を変更すると、設置個所で毎回BASIC認証のダイアログが発生。

「AuthUserFile」は「.htpasswd」の絶対PATH。

ユーザー指定

アクセス可能なユーザーを指定。
「.htpasswd」のユーザーを指定。

▼「.htpasswd」で「ユーザー:zebra」のパスワードを設定

zebra:〇〇〇〇

▼「.htaccess」で「require」を「zebra」にする

AuthUserfile /フルパス/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require user zebra

※「require valid-user」ではなく「require user 〇〇〇」とする

・「require valid-user」 - IDとパスワードが設定されていたら何でもOK。
・「require user 〇〇〇」 - 「ID:〇〇〇」のみOK。

ファイル指定

「Files」で囲む。

<Files 〇〇〇.php>
AuthUserfile /フルパス/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
</Files>

ファイル指定(複数)

「~ ()」の中にファイルを「|」区切りで入れる。
※「~」と「(」の間に半角空白あり。

<Files ~ (〇〇〇.php|〇〇〇.php)>
AuthUserfile /フルパス/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
</Files>

ファイル単位でユーザーを変える

BASIC認証の基本情報は別にして、ファイル単位で「require user 〇〇〇」を指定でいけるらしいが・・・記述が間違っているのかサーバの設定の問題なのかは不明だけど、動作しなかった。特に使う予定が無かったので、これ以上の調査はしていない。

AuthUserfile /フルパス/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic

<Files 〇〇〇.php>
require valid-user
</Files>

<Files 〇〇〇.php>
require valid-user
</Files>

ファイルじゃなくてURL指定

「Files」じゃなく「LocationMatch」を使う・・・詳細は未調査。
※「LocationMatch」じゃなく「Location」ってのもあるらしい。

<LocationMatch "/〇〇〇/〇〇〇">
~ 略 ~
</LocationMatch>

※記述か、サーバの設定か不明だけど、動作せず(※500エラーになってしまった)

ファイルじゃなくてURL指定2 / FuelPHPでも動作する指定

「Files」じゃなく「LocationMatch」も使わず・・・違うヤツを使う。
※太文字にしているトコ。

SetEnvIf Request_URI "/〇〇〇/〇〇〇" noauth
AuthUserfile /home/users/1/moo.jp-metadoll/web/zebra/lib/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
Satisfy any
Order Deny,Allow
Deny from all
allow from env=!noauth

※FuelPHPでも指定可能。

SetEnvIf Request_URI "/〇〇〇/〇〇〇" noauth 対象
・ページ指定(「hoge/zebra」にアクセスがあったとき):「SetEnvIf Request_URI "/hoge/zebra" noauth」
・ディレクトリ指定(「hoge/」内の何かにアクセスがあったとき):「SetEnvIf Request_URI "/hoge/*" noauth」
Satisfy any 以下のどちかの場合、アクセスを許可
・BASIC認証成功したとき(require valid-user)
・「SetEnvIf Request_URI」で指定したURLじゃないとき(allow from env=!noauth)
Order Deny,Allow
Deny from all
ひとまず全員拒否
allow from env=!noauth 「SetEnvIf Request_URI」で指定したURLじゃないときは許可

任意のURLへのアクセスのみBASIC認証をかける

基本、BASIC認証をかけない。でも、一部だけかけたいとき。

Satisfy Any # いずれかの条件を満たせばOK。記述場所はドコにあってもいいそうだ。

# 条件1:BASIC認証
AuthUserfile /フルパス/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user

# 条件2:特定のディレクトリ
SetEnvIf Request_URI "/zebra/" ngDir # 「ngDir」の値は「Request_URI」が「/zebra/」になる。
Order Deny,Allow                     # 「拒否してから、許可する」という順番指定
Deny from all                        # 全員拒否
allow from env=!ngDir                # 「ngDir」以外にアクセスがあったら「許可」→「ngDir」は拒否するからBASIC認証を成功させる必要アリ

※「env!=」じゃなく「env=!」。「!」の位置が違うだけで意味が変わるっぽい。

任意のURLへのアクセスのみBASIC認証をかけない

基本、BASIC認証をかける。でも、一部だけかけたくないとき。

Satisfy Any # いずれかの条件を満たせばOK。記述場所はドコにあってもいいそうだ。

# 条件1:BASIC認証
AuthUserfile /フルパス/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user

# 条件2:特定のディレクトリ
SetEnvIf Request_URI "/zebra/" okDir # 「okDir」の値は「Request_URI」が「/zebra/」になる。
Order Deny,Allow                     # 「拒否してから、許可する」という順番指定
Deny from all                        # 全員拒否
allow from env=okDir                 # 「okDir」へアクセスがあったら「許可」→「okDir」以外は拒否するからBASIC認証を成功させる必要アリ

※「/zebra/」だと「/〇〇〇/zebra」も対象。「/^zebra/」とすると「/〇〇〇/zebra」は対象外。

特定の人のみBASIC認証をかけない

基本、BASIC認証をかける。でも、任意のサブドメインへのアクセスや、任意のIPの人はかけたくないとき。

Satisfy Any # いずれかの条件を満たせばOK。記述場所はドコにあってもいいそうだ。

# 条件1:BASIC認証
AuthUserfile /フルパス/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user

# 条件2:許可対象の指定
SetEnvIf Host "^zebra\." okHost # 「okHost」の値は「Host」が「^zebra\.」になる。
Order Deny,Allow                # 「拒否してから、許可する」という順番指定
Deny from all                   # 全員拒否
allow from env=okHost           # 「okHost」へアクセスがあったら「許可」
allow from XXX.XXX.XXX.XXX      # 任意のIPの人からのアクセスも「許可」

Satisfy AnyとSatisfy All

・上記の例だと、「BASIC認証で成功した人」or「特定の条件を満たした人」という意味なので「Satisfy Any」。
・「特定の条件(A)」と「特定の条件(B)」の「両方を満たした人」という意味にしたければ「Satisfy All」。
※「IP制限+ディレクトリ制限」とかしたければ「Satisfy Any」

関連項目

.htaccessでBASIC認証
.htpasswdの中身の作成
PHPでBASIC認証