10 条规则不是问题,但供将来参考:通常的方法是将所有内容重定向到单个入口点,并让应用程序进行路由。一个简单的例子:
.htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule .* index.php [L,QSA]
索引.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']
.
如果您的应用程序是面向对象的,那么您会对前端控制器模式感兴趣。所有主要的 PHP 框架都以某种方式使用它,这可能有助于查看它们的实现。
如果没有,像Silex这样的微框架可以为您完成这项工作。在 Silex 中,您的路由可能如下所示:
索引.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']
为$var
并添加输出缓冲,您可能可以使用此 index.php 重用现有脚本:
画廊.php
ob_start();
// ...
return ob_get_clean();