Бен Патон, на самом деле есть очень простой выход.CMS, такие как Wordpress, склонны использовать его вместо того, чтобы возиться с регулярными выражениями.
Сторона .htaccess
Прежде всего, вы используете .htacess с содержанием ниже:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Позвольте мне объяснить, что он делает (строка за строкой):
- если существует модуль apache с именем mod_rewrite ..
- включить модуль
- пусть будет известно, что мы перезапишем все, что начинается после имени домена (для перезаписи только некоторых каталогов, используйте
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>';
?>
, который работал с URL-адресами, такими как:
index.php?id=5
Вы можете настроить его на работу с SEO-URL-адресами, а также сохранить на старой системев то же время.Во-первых, убедитесь, что .htaccess
содержит код, который я написал в приведенном выше.
Затем добавьте следующий код в самом начале вашего файла:
if ( isset( $_SERVER['REDIRECT_URL'] ) ) {
$url = explode('/', $_SERVER['REDIRECT_URL'] );
$_GET['id'] = $url[0];
}
Что мыделаешь здесь?Прежде чем перейти к двум вашим собственным кодам, мы в основном находим идентификаторы и информацию из старого URL-адреса и передаем их в переменную PHP _GET.По сути, мы дурачим ваш код, полагая, что запрос содержит эти переменные!
Единственное оставшееся препятствие - найти все эти надоедливые теги <a/>
и заменить их href
соответственно, но это другая история.:)