リクエストをフロントコントローラで処理する
PHPのアプリケーション設計において全てのリクエストURLをひとつのみのファイルで受け付ける処理方式のことや、また、そのファイルのことをフロントコントローラといいます。
フロントコントローラを採用していない場合、機能やページごとにリクエストを受け付けるPHPの実行ファイルを用意する必要があり、リクエストのURLも
https://example.com/login.php
https://example.com/user.php?id=1
のように、実行するPHPファイルに依存するレガシーな形式となってしまいます。
一般的なMVCパターンのWebフレームワークの多くでもフロントコントローラの形式となっており、単一の実行ファイルでリクエストを実行することで内部的にはソースの共通化などで冗長性を排除し、見た目の部分でも以下のようにシンプルでわかりやすいURL設計を実現します。
https://example.com/login/
https://example.com/users/1
.htaccessでリクエストURLを書き換える
フロントコントローラを実現するためには、Apache(Webサーバ)の設定を実行時に上書きする.htaccessファイルをドキュメントルート配下、実行ファイルと同じ階層に設置します。
ドキュメンルート配下
.
├── .htaccess
└── index.php(実行ファイル)
.htaccessの記述
.htaccessの記述を以下のとおりにします。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [QSA,L]
記述の設定内容を解説しますと、1行目の「RewriteEngine On」はApacheでmod_rewriteという機能が有効な場合に以降の処理を実行することを表します。
2行目と3行目のRewriteCondはURLの書き換えを行う条件となり、
続く、%から始まる変数名はリクエストされたファイル名を表しており、たとえば リクエストパスが /login の場合は「login」というファイル名をリクエストしていることになります。
各行で最後に 「-f」と「-d」が指定されていますが、こちらはそれぞれファイルとディレクトリを表しており、どちらも否定を表す ! 記号が前にあるため、
条件は 「リクエストファイルと同じ名前のファイルもしくはディレクトリが存在していないこと」 となります。
最後の4行目、RewriteRuleは書き換え(リライト)のルールを示しており、移管元のパスパターンとそれを移管する先のパスパターンを続けて記載します。
行の先頭を表す ^ 記号とその後ろに空白があることで全ての行、つまり、あらゆる全てのリクエストという意味になっており、続けて移管先パターンとして実行ファイルである index.phpが記載されているため、実在するファイルやディレクトリパスへのアクセスは物理的にレスポンスし、そうでない場合は全てindex.phpが実行されるという仕組みになっています。
また、よくあるパターンとして、リクエストの受付処理はindex.phpで行いたいけれど、画像などアセット類を格納するためのディレクトリとして、リクエストURLと同名のディレクトリはドキュメントルート内に設置する必要があるといった場合は、RewriteCondのリクエストファイル名の条件からディレクトリ判定を除外すればOKです。
.
├── .htaccess
├── index.php
└── login/
これでOK
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]