Рабочий и простой способ ЧПУ(Человеко понятых url адресов)
Мой рабочий способ создания ЧПУ на примере сайта mcgrp.ru. Структура сайта сделана по рекомендациям для вэбмастеров гугла и яндекса. Все станицы доступны в 3 кликах от главной, в данном случае даже 2х. Идея дянного чпу состоит в составлении адреса станицы на основе названия бренда или на основе бренда+названия модели с расширением html.
Основные задачи для создания подобных ссылок:
1. Так как названия состоят из кириллических символов, то следовательно необходимо вводить функции преобразование в латиницу.
2. По рекомендациям для разделения слов в ссылках рекомендуется использовать в качестве разделителя дефис("-"). И всяко не стоит использовать пробел. Символ нижнего подчеркивания("_") использовать не стоит, так как он используется в роли оператора объединения, а не разделения.
3. Перехват этих ссылок и подстановка параметров перед загрузкой основной страницы. То есть создать иллюзию того, что были переданы параметры методом Get или Post. Это требуется только в том случае если необходимо гарантировать доступность, по старым ссылкам. Да и в общем логичное поведение скрипта для возможно доработки.
4. Перевод на такие ссылки рекомендуется переводить полностью все возможные разделы и ссылки, если часть ссылок у вас останется в формате ?param1=value1¶m2=value2, то возможно возникнуть проблемы вида page1.html?param1=value1¶m2=value2 что негативно скажется на отношение поисковых систем к вашему сайту. И часть страниц может отправиться в "сопли".
Этап 1
Основа технологии ЧПУ является mod_rewrite вэбсервера Apache. Для начала следует убедиться, что данный модуль подключен. Далее следует внесение изменение в файл .htaccess в корне вашего сайта.
Пример файла:
1. RewriteEngine On
2. RewriteBase /
3. RewriteCond %{HTTP_HOST} ^www.mcgrp.ru$ [NC]
4. RewriteRule ^(.*)$ http://mcgrp.ru/$1 [R=301,L]
5. RewriteCond %{REQUEST_FILENAME} !-f
6. RewriteCond %{REQUEST_FILENAME} !-d
7. RewriteRule . / [L]
Очень важно соблюдать подобную последовательность.
Строка 1 включает модуль mod_rewrite.
Строка 2 указывает базу с которой надо отслеживать (вырезать адрес страницы).
Строки 3,4 отвечают за редирект сайта с www на сайт без www их следует указать до строк 5, 6 иначе будут наблюдаться глюки.
Этап 2
Теперь необходимо как то разбирать данные строки. Для этого предварительно необходимо подготовить соответствие в базе данных для каждой строки. Для этого нужно добавлять параметр в специальное поле при добавлении строки либо написать генератор для ручного запуска или по расписанию. Если ваш сайт уже большой, то генератор нужно будет написать и добавить поле в БД.
Для преобразования из кириллицы в латиницу, а также замены спецсимволов я использую 2 функции:
1.
function NormalizeStringToURL2( $s )
{
$r = array('а','б','в','г','д','е','ё','ж','з','и','й','к','л','м', 'н','о','п','р','с','т','у','ф','х','ц','ч', 'ш', 'щ', 'ъ','ы','ь','э', 'ю', 'я',' ');
$l = array('a','b','v','g','d','e','e','g','z','i','y','k','l','m','n', 'o','p','r','s','t','u','f','h','c','ch','sh','sh','', 'y','y', 'e','yu','ya','-');
//$s = str_replace( $r, $l, strtolower($s) );
$s = mb_eregi_replace("[^\w\-]","-",$s);
$s = preg_replace("/\-{2,}/",'-',$s);
return trim($s,'-');
}
2.
function translitIt($str)
{
$tr = array(
"А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
"Д"=>"d","Е"=>"e","Ж"=>"j","З"=>"z","И"=>"i",
"Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
"О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
"У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch",
"Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
"Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
"ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
"ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
" "=> "-", "."=> "", "/"=> "-", "--"=> "-", "---"=> "-", "----"=> "-", "-"=> "-"
);
return strtr($str,$tr);
}
Использую я их так.
$title = "Какой то title";
$cp = translitIt(NormalizeStringToURL2($title))).".html";
В $cp создается строка в формате подходящем для использования в ЧПУ.
Пример: kakoy-to-title.html
Этап 3
После того как все строки добавлены в БД, можно начинать прикручивать ЧПУ к движку сайта. Для этого надо создать скрипт который при обращении по адресу mcgrp.ru/kakoy-to-title.html подсовывал обрабатывающему скрипту параметры, которые в обычном варианте без чпу передавались в формате mcgrp.ru/index.php?param1=value1¶m2=value2
Создадим файл cp.php и подключим его в самом начале скрипта после подключение к базе данных.
Файл cp.php
if($_SERVER['REQUEST_URI']!="/")
{
$request = $_SERVER['REQUEST_URI'];
$request = urldecode(str_replace('/', '', $request));
$result = mysql_query("SELECT * FROM имя_таблицы WHERE cp='".$request."';");
while ($row = mysql_fetch_assoc($result)) {
if($row['cp'] == $request)
{
$param1 = $row['value1'];
$param2 = $row['value2'];
$ans = "yes";
}
}
}
PS:
Если количество страниц слишком велико, рекомендую сначала проделать пункт 2,3 потом уже вносить изменения в файл .htaccess.
Продумайте план по полному переходу на ЧПУ так как поисковые системы могут наказать за дублирование заголовков, если страницы доступны по 2 урл с одинаковым содержимым.
Старайтесь выбирать строку для генерации ЧПУ с уникальным содержимым, бывают ситуации из за плохого продумывания строки ЧПУ, она генерировалась с одинаковым текстом и следовательно 2 разных записи в БД указывали на 1 страницы. Чтобы избежать подобного при навигации по разделам с большим количеством страниц можно воспользоваться таким форматом page9-razdel1.html и при обработке обрезать и извлекать номер страницы preg_match регуляркой.
Основные задачи для создания подобных ссылок:
1. Так как названия состоят из кириллических символов, то следовательно необходимо вводить функции преобразование в латиницу.
2. По рекомендациям для разделения слов в ссылках рекомендуется использовать в качестве разделителя дефис("-"). И всяко не стоит использовать пробел. Символ нижнего подчеркивания("_") использовать не стоит, так как он используется в роли оператора объединения, а не разделения.
3. Перехват этих ссылок и подстановка параметров перед загрузкой основной страницы. То есть создать иллюзию того, что были переданы параметры методом Get или Post. Это требуется только в том случае если необходимо гарантировать доступность, по старым ссылкам. Да и в общем логичное поведение скрипта для возможно доработки.
4. Перевод на такие ссылки рекомендуется переводить полностью все возможные разделы и ссылки, если часть ссылок у вас останется в формате ?param1=value1¶m2=value2, то возможно возникнуть проблемы вида page1.html?param1=value1¶m2=value2 что негативно скажется на отношение поисковых систем к вашему сайту. И часть страниц может отправиться в "сопли".
Этап 1
Основа технологии ЧПУ является mod_rewrite вэбсервера Apache. Для начала следует убедиться, что данный модуль подключен. Далее следует внесение изменение в файл .htaccess в корне вашего сайта.
Пример файла:
1. RewriteEngine On
2. RewriteBase /
3. RewriteCond %{HTTP_HOST} ^www.mcgrp.ru$ [NC]
4. RewriteRule ^(.*)$ http://mcgrp.ru/$1 [R=301,L]
5. RewriteCond %{REQUEST_FILENAME} !-f
6. RewriteCond %{REQUEST_FILENAME} !-d
7. RewriteRule . / [L]
Очень важно соблюдать подобную последовательность.
Строка 1 включает модуль mod_rewrite.
Строка 2 указывает базу с которой надо отслеживать (вырезать адрес страницы).
Строки 3,4 отвечают за редирект сайта с www на сайт без www их следует указать до строк 5, 6 иначе будут наблюдаться глюки.
Этап 2
Теперь необходимо как то разбирать данные строки. Для этого предварительно необходимо подготовить соответствие в базе данных для каждой строки. Для этого нужно добавлять параметр в специальное поле при добавлении строки либо написать генератор для ручного запуска или по расписанию. Если ваш сайт уже большой, то генератор нужно будет написать и добавить поле в БД.
Для преобразования из кириллицы в латиницу, а также замены спецсимволов я использую 2 функции:
1.
function NormalizeStringToURL2( $s )
{
$r = array('а','б','в','г','д','е','ё','ж','з','и','й','к','л','м', 'н','о','п','р','с','т','у','ф','х','ц','ч', 'ш', 'щ', 'ъ','ы','ь','э', 'ю', 'я',' ');
$l = array('a','b','v','g','d','e','e','g','z','i','y','k','l','m','n', 'o','p','r','s','t','u','f','h','c','ch','sh','sh','', 'y','y', 'e','yu','ya','-');
//$s = str_replace( $r, $l, strtolower($s) );
$s = mb_eregi_replace("[^\w\-]","-",$s);
$s = preg_replace("/\-{2,}/",'-',$s);
return trim($s,'-');
}
2.
function translitIt($str)
{
$tr = array(
"А"=>"a","Б"=>"b","В"=>"v","Г"=>"g",
"Д"=>"d","Е"=>"e","Ж"=>"j","З"=>"z","И"=>"i",
"Й"=>"y","К"=>"k","Л"=>"l","М"=>"m","Н"=>"n",
"О"=>"o","П"=>"p","Р"=>"r","С"=>"s","Т"=>"t",
"У"=>"u","Ф"=>"f","Х"=>"h","Ц"=>"ts","Ч"=>"ch",
"Ш"=>"sh","Щ"=>"sch","Ъ"=>"","Ы"=>"yi","Ь"=>"",
"Э"=>"e","Ю"=>"yu","Я"=>"ya","а"=>"a","б"=>"b",
"в"=>"v","г"=>"g","д"=>"d","е"=>"e","ж"=>"j",
"з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l",
"м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"r",
"с"=>"s","т"=>"t","у"=>"u","ф"=>"f","х"=>"h",
"ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch","ъ"=>"y",
"ы"=>"yi","ь"=>"","э"=>"e","ю"=>"yu","я"=>"ya",
" "=> "-", "."=> "", "/"=> "-", "--"=> "-", "---"=> "-", "----"=> "-", "-"=> "-"
);
return strtr($str,$tr);
}
Использую я их так.
$title = "Какой то title";
$cp = translitIt(NormalizeStringToURL2($title))).".html";
В $cp создается строка в формате подходящем для использования в ЧПУ.
Пример: kakoy-to-title.html
Этап 3
После того как все строки добавлены в БД, можно начинать прикручивать ЧПУ к движку сайта. Для этого надо создать скрипт который при обращении по адресу mcgrp.ru/kakoy-to-title.html подсовывал обрабатывающему скрипту параметры, которые в обычном варианте без чпу передавались в формате mcgrp.ru/index.php?param1=value1¶m2=value2
Создадим файл cp.php и подключим его в самом начале скрипта после подключение к базе данных.
Файл cp.php
if($_SERVER['REQUEST_URI']!="/")
{
$request = $_SERVER['REQUEST_URI'];
$request = urldecode(str_replace('/', '', $request));
$result = mysql_query("SELECT * FROM имя_таблицы WHERE cp='".$request."';");
while ($row = mysql_fetch_assoc($result)) {
if($row['cp'] == $request)
{
$param1 = $row['value1'];
$param2 = $row['value2'];
$ans = "yes";
}
}
}
PS:
Если количество страниц слишком велико, рекомендую сначала проделать пункт 2,3 потом уже вносить изменения в файл .htaccess.
Продумайте план по полному переходу на ЧПУ так как поисковые системы могут наказать за дублирование заголовков, если страницы доступны по 2 урл с одинаковым содержимым.
Старайтесь выбирать строку для генерации ЧПУ с уникальным содержимым, бывают ситуации из за плохого продумывания строки ЧПУ, она генерировалась с одинаковым текстом и следовательно 2 разных записи в БД указывали на 1 страницы. Чтобы избежать подобного при навигации по разделам с большим количеством страниц можно воспользоваться таким форматом page9-razdel1.html и при обработке обрезать и извлекать номер страницы preg_match регуляркой.
Комментарии
Отправить комментарий