URLとは何か、ルーティングの設定方法
URLは、いくつかの部分で構成される単純な文字列です。
http://example.com/foo?bar=baz
| | | |
| | | +- query
| | +- path
| +- host
+- scheme
URLには、認証情報、ポート、フラグメントが追加で含まれている場合がありますが、ここでは単純に保つようにします。Kunststube\Routerはパスのみを扱います。スキームとクエリは通常、ルーティングに影響を与えず、ホストは通常、Webサーバーによって処理されます。
Apache Webサーバーを使用した一般的なセットアップを想定すると、Apacheは通常「ルーティング」を行います。次のようなHTTPリクエストを受信します。
GET /foo/bar/baz?some=parameters HTTP/1.1
これで、Webサーバーは、選択した方法でこの要求に自由に応答できるようになります。ほとんどのWebサーバーがデフォルトで行うことは、URLのパスをハードディスク上のファイルにマップすることです。Webサーバーは、最初に適切なDocumentRootが何であるか、つまり「パブリックWebフォルダー」として構成されたディスク上のフォルダーを把握します。DocumentRootがであると仮定しましょう/var/www
。次に、リクエストパスをそのルートに連結し、結果として/var/www/foo/bar/baz
。次に、そのファイルがディスク上に存在するかどうかを判断し、応答として提供しようとします。要求されたファイルがで終わる場合、.php
またはApacheがファイルをPHPファイルとして扱うように構成されている場合、出力を返す前に、まずPHPインタープリターを介してファイルを実行します。
PHPルーターを使用して独自のカスタムルーティングを使用するには、Apacheがファイルを検索してディスク上で提供するプロセスをインターセプトする必要があります。これは、Apache構成ファイルで実行できます。しかし、これらのファイルにアクセスできる場合は、自分が何をしているかを知っていると思います。そこでは、最適なセットアップの具体的な詳細については説明しません。代わりに、コアApache構成ファイルを編集できない、または編集したくない、またはファイルに頼る典型的なケースについて説明し.htaccess
ます。Apacheがディスク上のディレクトリ構造をトラバースして、提供する正しいファイルを見つけると、呼び出されたファイル.htaccess
がその中に配置されているかどうかを各ディレクトリでチェックします。見つかった場合は、実行するか、その中で定義されているルールをファイル検索プロセスに組み込みます。
達成したいのは、Apacheがすべてのリクエストに対して1つの特定のPHPファイルを「検索」して実行し、元のURLをそのPHPファイルで使用できるようにして、独自のルーティングを実行できるようにすることです。これを行う最も簡単で汚い方法は簡単RewriteRule
です:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
</IfModule>
これをファイルに入れると仮定しましょう/var/www/.htaccess
。Apacheがそのディレクトリでファイル検索を開始すると、これらの書き換えルールが解析されます。この時点でApacheが探しているパスの「内部状態」はですfoo/bar/baz
。の正規表現^(.*)$
は
RewriteRule
そのパスに一致し(式は基本的に「何にでも一致する」と言います)、ルールはパスをに書き換えます
index.php?url=/foo/bar/baz
。次に、オリジナルsome=parameters
がそのパス/ URLに再度追加されます(QSA
フラグのため)。その後、Apacheは書き直されたパスを探し続けますindex.php
。したがって、コードを挿入するだけ/var/www/index.php
で、Apacheはそのコード用のPHPインタープリターを起動します。PHPにはURLクエリ部分が渡されます
。これは、PHPでは次のように?url=/foo/bar/baz&some=parameters
アクセスできます。
$_GET['url']
$_GET['some']
。したがって、完全なセットアップは次のようになります。
基本設定
ファイル/フォルダの構造
/var
/www
.htaccess
index.php
/Kunststube
/Router
Router.php
...
.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
</IfModule>
index.php
<?php
require_once 'Kunststube/Router/Router.php';
$r = new Kunststube\Router\Router;
$r->add('/foo');
...
$r->route($_GET['url']);
そして、それがすべてです。すべてのリクエストを同じPHPファイルにリダイレクトし、元のURLをクエリパラメータとして追加する基本的な書き換えルール。これは、ルーティングプロセスを呼び出すために使用されます。
警告と微調整
上記の設定の重要な注意点の1つはurl
、元のクエリパラメータが書き換えられたURLに追加されるため、URLにというクエリパラメータを含めることができないことです。URL
/foo/bar?url=baz
は次のように書き換えられます。
index.php?url=/foo/bar&url=baz
2番目のurl
パラメーターが最初のパラメーターに置き換わります。アプリケーションでクエリパラメータを使用する必要がある場合はurl
、書き換えルールに別のパラメータ名を選択してください。
次に、Kunststube \ Routerは、渡されるURLが
。route()
で始まることを想定していることに注意してください/
。上記のように、またはPHPで、書き換えプロセス中にそのスラッシュを追加できます。そこにあることを確認してください。
第三に、通常、CSSや画像ファイルなど、PHPを介してルーティングしたくないファイルもあります。それらをApacheから直接提供する必要があります。このための適切な設定は次のとおりです。
/var
/Kunststube
/Router
...
/MyApp
MyScript.php
...
/www
.htaccess
index.php
/css
style.css
...
/img
kitten.jpg
...
パブリックWebルートディレクトリからすべての実際のPHPファイルを取り出し、パブリックアセットファイルと最小限のindex.php
ファイルのみをそこに残します。RewriteRuleを次のように調整します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=/$1 [QSA,L]
</IfModule>
は、要求されたファイルが物理的に存在しない場合にのみ適用されるRewriteCond
ことを確認します( )。つまり、ファイルは実際に存在し、Apacheはそれを直接提供できるため、URLのリクエストはそのまま通過します。物理的に存在しない「架空の」ファイルに対するリクエストはすべて送信
され、そこにルーティングできます。内部では、ルーターへの正しいパスを使用していることを確認してください。RewriteRule
!-f
css/style.css
index.php
index.php
require_once '../Kunststube/Router/Router.php';
実際、ルートを他の場所に完全に定義し、オートローダーを使用して必要なファイルをロードすることをお勧めしますが、これはこのドキュメントの範囲外です。