[CodeIgniter] 同じ.htaccessで本番と開発環境を切り替える

CodeIgniterは、Apacheからもらう「CI_ENV」というサーバー変数で開発環境か本番かを判定しています。しかし、Gitレポジトリなどでコードを管理している場合は、本番と開発環境で同じ.htaccessを使いたいところ。今回は、その方法を試してみたのでまとめました。

SetEnvIfを使う

Apacheには、「SetEnvIf」というディレクティブがあって、条件にあった時だけサーバー変数を入れることができます。この機能を使うことで、本番と開発環境の切り替えができます。

SetEnvIf Host "^本番のURL$" CI_ENV=production

とすることで、動いているサーバーが本番のURLだった時にはCI_ENVにproductionが挿入されます。CI_ENVがない場合は、自動的にdevelopmentとなるのがCodeIgniterの仕様ですので、この例ではサーバーのURLがマッチしなければすべて開発環境扱いになります。

リバースプロキシ環境は注意

自分がハマったのは、「nginxでリバースプロキシ+ Apache」という環境で、nginxが内部のIPアドレスへ転送しているケース。この場合、ブラウザが表示しているURLはドメインですが、Apacheが取得する「Host」はApacheのIP+ポートだったりします。

そういう時は、一度index.phpあたりに

var_dump($_SERVER['HTTP_HOST']);

を入れて、HOSTの文字列を確認します。

確認できたら、URL部分を書き換えます。

SetEnvIf Host "^127.0.0.1:1111$" CI_ENV=production

これで適用されます。

どちらかだけBasic認証

同じ要領で、「本番はオープン、開発環境はBasic認証をつける」ということもできます。

# すべてのアクセスを拒否
order deny,allow
deny from all 
satisfy any

# dev.hogehoge.comにはenvに「server_pro」をつける
SetEnvIf Host "^dev.hogehoge.com$" server_pro

# envが「server_pro」なら許可
allow from env=server_pro

AuthUserFile "/home/user/hogehoge/htpasswd/.htpasswd"
AuthName "Member Site"
AuthType BASIC
require valid-user

簡単ですね。


1ファイルで本番・開発環境の使い分けができると、ソースの管理が楽になるのでおすすめです。

しかし、Apacheは前から使っているけど意外と理解していないなぁと実感しました。勉強不足ですね。