[CodeIgniter] 同じ.htaccessで本番と開発環境を切り替える
CodeIgniterは、Apacheからもらう「CI_ENV」というサーバー変数で開発環境か本番かを判定しています。Gitレポジトリなどでコードを管理している場合は、本番と開発環境で同じ.htaccessを使いたいので、その方法を試してみたのでまとめました。
更新日: 2018.7.17公開日: 2018.4.11
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は前から使っているけど意外と理解していないなぁと実感しました。勉強不足ですね。