.htaccessのBASIC認証を開発環境と本番環境で切り替える

Webの開発や運営をしていると、簡易CMS(Contents Management System)を用意して作業の効率化を図ったり、メンテナンス自体をWebページから出来るようにしたりすることがあるかと思います。

その際、当然のことながら、その管理ページへ誰でもアクセスできてしまうと困るため、PHPでログインシステムを組んだり、BASIC認証をかけたりしますよね。

BASIC認証のパスワードファイルに相対パスは使えない

Require valid-user
AuthType Basic
AuthUserFile /virtual/example.com/.htpasswd
AuthName MembersOnly

例えばこんな感じの.htaccessファイルを用意して、BASIC認証したいディレクトリに置くのが一般的かと思いますが、このAuthUserFileに相対パスは使えません

レンタルサーバーと開発環境(≒ローカルPCのテスト環境)でディレクトリの構成をほとんど同じにしている場合、

AuthUserFile ../.htpasswd

のように、ひとつ上のディレクトリの.htpasswdを使う、みたいな指定をしたくなることがありますが、これが出来ません。

開発環境がWindowsの場合、例えば

AuthUserFile C:/Apache2/.htpasswd

こんな指定をしないといけないわけです。

あるいはそもそも開発環境ではBASIC認証自体をしたくない、というケースもあるのではないでしょうか。

いずれにせよ、開発環境と本番環境でそれぞれ異なる.htaccessを用意するのも手間ですし、何より間違って本番環境へアップロードをしてしまったら大変です。

なので、できれば.htaccessの中で条件分岐し、BASIC認証を使うか使わないかを選択したいところ。

PHPのコードを環境ごとに切り替える場合はSetEnvを使う

ちょっと余談ですが、PHPの中で開発環境か、本番環境か、を判定するのには環境変数をよく使います。

開発環境のApacheのhttpd.confの中で以下のような指定をしておくことで、

SetEnv DEVELOP 'on'

PHPで以下のような分岐処理をすることが可能です。

if (getenv('DEVELOP') == 'on') {
	echo '開発環境です';
} else {
	echo '本番環境です';
}

しかし、SetEnvの処理は.htaccessの読み込みの後に行われるため、.htaccess内で参照することが出来ません。

.htaccess内で条件分岐するにはApacheの起動オプションを使うと良い

具体的にはこんな感じ。

httpd.exe -D DEVELOP

-Dオプションの後に値を設定することで、Ifdefineディレクティブで参照できる変数が用意されます。

.htaccessで分岐する場合はこんな感じ。

<Ifdefine !DEVELOP>
Order Deny,Allow
Deny from all

Require valid-user
AuthType Basic
AuthUserFile /virtual/example.com/.htpasswd
AuthName MembersOnly
</Ifdefine>

DEVELOPが定義されていない場合のみ、BASIC認証を使う。つまり、逆に言えば開発環境ではBASIC認証が動作しない、というわけです。

ApacheがWindowsサービスとして動作している場合

Windowsサービスとして動作している場合は、下記のようなレジストリに起動オプションが書いてあるため、そこを書き換えます。

■Apache 2.2の場合
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Apache2.2

■Apache 2.4の場合
\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Apache24

もしかしたら、微妙に違うかも知れませんがw サービスとして動いているのなら必ずServicesの下にApacheらしき名前のレジストリキーがあるハズなので探してみてください。

このレジストリキーの中にある ImagePath に、

"C:\Apache2\bin\httpd.exe" -k runservice

というような記述があるため、

"C:\Apache2\bin\httpd.exe" -D DEVELOP -k runservice

のように書き換えます。もちろん、-Dの後はお好きな変数名でOKです。

まとめ

  • BASIC認証のパスワードファイルの場所を相対パス指定はできない。
  • PHPなどで開発環境/本番環境の条件分岐にはSetEnvをよく使うが、.htaccessからは参照できない。
  • Windowsの場合、Apacheの起動オプションに-Dを付けることでIfdefineディレクティブでの条件分岐が可能となる。

といったところでしょうか。

ほかにもIPアドレスやホスト名で条件分岐する方法もありますが、あんまり汎用的ではないし、ホスト名については偽装もできちゃうので、ちょっとどうなのかなぁーと思い、だいたいうちではこのIfdefineによる方法で開発環境と本番環境を切り替えています。

以上、需要あるのかどうかは正直微妙ですが、備忘録として記事にしてみました。

adsbygoogle

フォロー