Apache は web サーバの一つで PHP プログラムとつなげることで PHP を使った web サービスを動かせます。
Welcome to The Apache Software Foundation!
.htaccess はディレクトリ単位で Apache 設定を変更する方法を提供します。Apache と Laravel を使った基本動作は Apache 本体の設定で Laravel の公開ディレクトリ(デフォルトでは/public)をドキュメントルートとしてリクエストを飛ばし、公開ディレクトリ内の .htaccess で Laravel プロジェクト内の細かい処理をする、というものです。
Apache チュートリアル: .htaccess ファイル – Apache HTTP サーバ バージョン 2.4
この公開ディレクトリ内の .htaccess を使って、あるアクセスの仕方では開発環境用動作、別のアクセスの仕方では本番環境用動作、と振り分けをすることができます。
Laravel 外部における開発環境、本番環境の設定権で最も優先されるのは環境変数です(ソースコード内部でべた書きされたり、キャッシュ済みでしたら外部でどうこうしようと操作できません)。Laravel ではよく .env というファイルで実行環境の設定を行いますが、この .env とは環境変数の代理です。Laravel、PHP以外の他言語でも基本的(あくまで慣例であって実装依存)にそういう立ち位置です。Laravel 内部で使用されている .env を読み込むライブラリである vlucas/phpdotenv も $_ENV 等の言語レベルの環境変数に値が見当たらなければ .env 読み取りに行くつくりになっています。
vlucas/phpdotenv: Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.
このため .htaccess 上で実行時の環境変数を制御することでアクセス内容によって Laravel の本番環境、開発環境の切り替えができます。これは例えば次の様に行えます。
# 公開ディレクトリ直下に置く .htaccess に以下を追記 # .env 内で #APP_ENV=production #APP_DEBUG=false # と定義している想定で <IfModule mod_setenvif.c> SetEnvIf Remote_Addr 192.168.99.1 APP_ENV=local SetEnvIf Remote_Addr 192.168.99.1 APP_DEBUG=true </IfModule>
mod_setenvif – Apache HTTP サーバ バージョン 2.4
mod_setenvif モジュールによって条件付きで環境変数をセットできます。上述の例では SetEnvIf ディレクティブを使ってサーバにアクセスしてきたクライアントの IP アドレスによって環境変数を書き換えています。例ではローカルですが、実際には信用できるネットワークなどにすることが多いと思います。ifで使える条件は詳しくは上記ドキュメントですが、サーバ側の状況も含めて他にも色々な条件を付けられます。
こんな風に.htaccsessで環境変数を制御すると外部公開している様な常に本番環境モードで動くべきプログラムもデバッグしやすくなります。