Делаем человеко понятные урлы (чпу)

Воскресенье, 16 мая 2010 21:38

В своей первой статье про mod_rewrite я рассказал, как сделать замену url на одно ключевое слово. Теперь можно рассмотреть более сложны варианты.
Начнём с url, которые имеют несколько параметров. На практике это обычно какой-либо предмет и его категория.

Предположим наш сайт содержит огромное кол-во музыки. Которая распределена по жанрам, а жанры уже разбиты на группы. Тогда замененная ссылка будет выглядеть примерно так:

http://mus_site.net/music/S1 /G1.html

А ссылка обработчика допустим вот так:

http://mus_site.net/show_music.php?style=1&group=1

Ну и правило оказывается не так и сложным, просто чуток длиннее.

RewriteRule ^music/S([0-9]*)/G([0-9]*)\.html$ /show_music.php?style=$1&group=$2

url получается хоть и привлекательный, но не совсем понятный. Надо бы добавить ключевых слов. Чтобы вышло примерно следующее:

http://mus_site.net/music/style/group.html

Но сделать это уже сложнее, так как явных идентификаторов в такой ссылке нету. Можно добавить в таблицу поле, которое будет связывать url с ключевиками и url, созданные обработчиком. А можно добавить идентификаторы к ключевым словам и получить вот такой url:

http://mus_site.net/music/style-s1/group-g1.html

Такая ссылка содержит ключевые слова и подогнать её под обработчик не составит труда.

RewriteRule ^.*-s([0-9]+)/.*-g([0-9]+)\.html$ /rewrite/index.php?style=$1&group=$2 [L]

Учтите, что в файле .htaccess писать правило надо в одну строчку.

Теперь смоделируем реальную ситуацию, в которой создание ссылок положим на плечи php. Представим, что у сайта есть бд в которой хранятся стили и музыкальные группы. Наша задача из всего этого сделать ссылку, которую поймет наше последнее правило mod_rewrite. В одной умной книжке подобная задача уже была решена с помощью двух функций, которые мы сейчас и рассмотрим.

functions.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 define('SITE', 'http://localhost/rewrite/');
//приводим url к нормальному виду
function clear_url($str)
{
$good_liters= '#[^-a-zA-Z0-9_]#';
//оставляем латиницу, подчеркивания, пробелы и дефисы.
$str = preg_replace($good_liters, '', $str);

//откусываем пробелы по сторонам
$str = trim($str);
//и всё подменяем  дефисами
$str = preg_replace('#[-_ ]+#', '-', $str);

return $str;
}

//делаем ссылку с ключевиками
function create_url($cat_name,$cat_id,$group_name,$group_id)
{
$clear_cat_name = clear_url($cat_name);
$clear_group_name = clear_url($group_name);

$url = SITE.$clear_cat_name.'-s'.$cat_id .'/'.
$clear_group_name.'-g'.$group_id.'.html';

return $url;

}
?>

nav.html

index.php

1
2
3
4
include("functions.php");
include("nav.html");
echo 'стиль группы c номером  '.$_REQUEST['style'].' а сама группа под номером '.$_REQUEST['group'];
?>

Как вы можете догадаться в строчку
create_url(”dance_music”,2,”pop group”,32)
нужно просто подставить значения при выводе из бд. И всё будет как надо



Вы можете оставить отзыв или трекбек со своего сайта.

Ваш отзыв