10 個のルールは問題ではありませんが、今後の参考のために: 通常のアプローチでは、すべてを 1 つのエントリ ポイントにリダイレクトし、アプリケーションにルーティングを任せます。簡単な例:
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L,QSA]
index.php
$query = $_SERVER['REQUEST_URI'];
$queryParts = explode('/', $query);
switch($queryParts[0]) {
case 'movies':
// ...
break;
case 'album':
// ...
break;
case 'img':
// ...
break;
// ...
default:
// 404 not found
}
このRewriteCond
条件により、既存のファイルへの要求が書き換えられないことが保証されます。QSA はオプションです。「追加されたクエリ文字列」を意味するため、たとえばmovies.html?sort=title
に書き換えられindex.php?sort=title
ます。元のリクエスト URI は で入手できます$_SERVER['REQUEST_URI']
。
アプリケーションがオブジェクト指向の場合は、Front Controllerパターンに関心があります。すべての主要な PHP フレームワークは何らかの方法でそれを使用しています。それらの実装を調べると役立つ場合があります。
そうでない場合は、 Silexのようなマイクロ フレームワークが役に立ちます。Silex では、ルーティングは次のようになります。
index.php
require_once __DIR__.'/../vendor/autoload.php';
$app = new Silex\Application();
$app->get('/{year}/{month}/{slug}', function ($year, $month, $slug) use ($app) {
return include 'article.php';
});
$app->get('/movies/{movie}.html', function ($movie) use ($app) {
return include 'gallery.php';
});
$app->get('/album/{album}.html', function ($album) use ($app) {
return include 'gallery.php';
});
$app->get('/img/{parent}/{img}.html', function ($parent, $img) use ($app) {
return include 'gallery.php';
});
$app->get('/movies.html', function () use ($app) {
return include 'gallery.php';
});
$app->run();
gallery.php
article.php
出力を返す必要があります。出力バッファリングを置き換え$_GET['var']
て追加すると、おそらくこの index.php で既存のスクリプトを再利用できます。$var
gallery.php
ob_start();
// ...
return ob_get_clean();