
テスト環境ではBasic認証をかけ、本番環境では外したい (ただし同じ .htaccess ファイルで)

Basic認証の話なんですが
- テスト環境にはBasic認証をかけたい。
- 本番環境ではBasic認証は外したい。
- ローカル環境もBasic認証かけたくない。
- ただし、なんらかの事情により .htaccess ファイルは共通の内容にしたい。
という場合の、対処方法です。
(納品やコード管理上の都合で、.htaccess ファイルを環境ごとに変えられない場合もありますので……)
記述例
以下のような .htaccess ファイルを書くと、接続先のホスト名によってBasic認証の有無が変わります。
この例では、接続先が www.example.com
または localhost
の場合は認証なし、その他のホスト名の場合は認証ありとなります。
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Order Deny,Allow | |
Deny from all | |
# Allow か Require どちらかの条件にマッチすればOKとする | |
Satisfy Any | |
# 接続先ホスト名による許可 | |
SetEnvIf HOST "^(www\.example\.com|localhost)$" noAuth | |
Allow from env=noAuth | |
# Basic認証 | |
Require valid-user | |
AuthType Basic | |
AuthName "Please enter your ID and password" | |
AuthUserFile /app/.htpasswd |
説明
8行目: SetEnvIf Host 〜
の部分で接続先ホスト名を判断し、マッチした場合は noAuth
という環境変数を設定しています。
9行目: Allow from env=noAuth
は、その環境変数が設定されていれば接続を許可する、という記述です。
この2行のセットにより、特定のホスト名の場合はBasic認証なしで接続できるようにしました。
もう1つポイントは 5行目の Satisfy Any
で、これは「ホスト名かBasic認証のどちらかでアクセスできる」という設定をしています。この行がないと意図したとおりに動きません。(デフォルトは Satisfy All
で、その場合「ホスト名とBasic認証の両方をクリアしないとアクセスできない」となります)
12行目以降は、いつもどおりの Basic認証の記述です。
余談ですが、Apache の SetEnvIf
は User-Agent やリファラでの判定も可能なので、特定ブラウザからのアクセスに対して〜とか特定URLからのアクセスに対して〜、とかで処理を分けることもできるようですね。
参考
Apache ドキュメンテーションの以下の項目