Ben Paton,其实有一个非常简单的出路。像 Wordpress 这样的 CMS 倾向于使用它而不是使用正则表达式。
.htaccess侧
首先,您使用具有以下内容的 .htacess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
让我解释一下它的作用(逐行):
- 如果名为 mod_rewrite 的 apache 模块存在。
- 打开模块
- 让我们知道我们将在
域名(只重写部分目录,使用
RewriteBase
/subdir/)
- 如果请求的路径不作为文件存在...
- 它甚至不作为目录存在...
- “重定向”请求到 index.php 文件
- 关闭我们的模块条件
以上只是一个简单的解释。你真的不需要它来使用它。
我们所做的是,我们告诉 Apache 所有最终会以 404 结尾的请求将它们传递到 index.php 文件,我们可以在其中手动处理请求。
PHP 方面
在 PHP 方面,在 index.php 中,您只需解析原始 URL。此 URL 在 $_SERVER 变量中作为 $_SERVER['REDIRECT_URL'] 传递。
最好的部分,如果没有重定向,这个变量就没有设置!
所以,我们的代码最终会是这样的:
if ( isset( $_SERVER['REDIRECT_URL'] ) ) {
$url = explode('/', $_SERVER['REDIRECT_URL'] );
switch($url[0]){
case 'home': // eg: /home/
break;
case 'about': // eg: /about/
break;
case 'images': // eg: /images/
switch( $url[1] ){
case '2010': // eg: /images/2010/
break;
case '2011': // eg: /images/2011/
break;
}
break;
}
}
轻松集成
我差点忘了提及这一点,但是,由于它的工作方式,您甚至可以完全不更改现有代码!
少说话,多举例。假设您的代码如下所示:
<?php
$page = get_page($_GET['id']);
echo '<h1>'. $page->title .'</h1>';
echo '<div>'. $page->content .'</div>';
?>
适用于以下网址:
index.php?id=5
您可以使其与 SEO URL 一起使用,同时与旧系统保持一致。首先,确保.htaccess 包含我在上面写的代码。
接下来,在文件的最开头添加以下代码:
if ( isset( $_SERVER['REDIRECT_URL'] ) ) {
$url = explode('/', $_SERVER['REDIRECT_URL'] );
$_GET['id'] = $url[0];
}
我们在这里做什么?在编写两个您自己的代码之前,我们基本上是从旧 URL 中查找 ID 和信息,并将其提供给 PHP 的 $_GET 变量。
我们实际上是在愚弄您的代码,以为请求具有这些变量!
唯一剩下的障碍就是找到所有那些讨厌的<a/> 标签并相应地替换它们的href,但这是另一回事。 :)