Почему важны URL?
Статические URL и динамические URL
Статические URL
Динамические URL
URL-адреса и CTR
URL-адреса и дублированный контент
URL-адреса в реальном мире
Пример 1: динамические URL-адреса
Пример 2: числовая подмена в URL-адресах
Пример 3: URL-адреса со вставленными ключевыми словами
Поддержка согласованности URL-адресов
Подмена URL
Инсталляция mod_rewrite
Тестирование mod_rewrite
Введение в регулярные выражения
Подмена URL и PHP
Подмена числовых URL с двумя параметрами
Подмена URL с ключевыми словами

Создание генератора ссылок

Раньше, когда вы работали только с динамическими URL-адресами, было легко
создавать эти адреса непосредственно в коде приложения, не задумываясь о каком-то
планировании. Но сейчас это уже невозможно. Если вы хотите использовать в своем
Web-сайте URL-адреса с ключевыми словами, то одного правила RewriteRule в файле
.htaccess уже недостаточно! Нужно еще обеспечить, чтобы все ссылки во всем Web-
сайте согласованно использовали эти версии с ключевыми словами. Конечно, мы не
будем рассматривать ручную вставку URL-адресов в Web-сайт: в конце концов, это же
динамический сайт, и при наличии большого количества продуктов в каталоге задача
управления ссылками становится неуправляемой.
К счастью, у этой задачи имеется очень простое решение, которое, сразу после его
реализации, снимает все лишние трудности по управлению ссылками. Предлагаемое
нами решение — это применение функции для генерации новых URL на основе данных,
уже существующих в базе данных, таких как название продукта или категория.
Как уже было сказано, это также улучшает согласованность ссылок.
Пусть, к примеру, у вас есть продукт под названием "Super Drill" (Супер-дрель),
который относится к категории "Tools" (Инструменты). Вы знаете, что идентификатор
продукта равен 9, а идентификатор категории — 5. Нетрудно создать РНР-функ-
цию, которая использует эти данные для генерации ссылки наподобие /Products/
Tools-C5/Super-Drill-P9.html.
В приведенном ниже упражнении вы создадите, а затем используете две РНР-функции.
• _prepare_url_text — принимает в качестве параметра строку для вставки в
усовершенствованный URL (название продукта или категорию) и преобразовывает
ее в форму, которую можно вставить в URL. К примеру, эта функция должна
преобразовывать "Super Drill" в "Super-Drill".
• make_product_url — принимает в качестве параметров название продукта, категорию и их идентификаторы, а затем с помощью вызова _prepare_url_text
генерирует URL наподобие /Products/Tools-C5/Super-Drill-P9 .html.
Если вы приверженец объектно-ориентированного программирования на РНР, то вы можете поместить эти функции в класс. В таком случае функция _ prepare_url_text ()) должна быть оформлена в виде приватного метода, т.к. она нужна только для внутреннего использования, a make_product_url () — в виде общедоступного метода. В этой главе возможности ООП не применяются, чтобы примеры были как можно более простыми и короткими, однако в начале имен функций, которые предназначены только для внутреннего использования,
стоит символ подчеркивания (как в _prepare_url_text()), чтобы облегчить
возможную миграцию в объектно-ориентированный код. В дальнейшем там, где это будет нужно для упражнений, в книге будут использоваться и объектно-ориентированные возможности РНР.

1. В папке seophp создайте новую папку с именем include .
2. В папке include создайте текстовый файл с именем config.inc.php и поместите
в него следующий код:
<?php
/ / домен сайта; конечный ' /' не нужен!
define('SITEJPOMAIN', 'http://seophp.exanple.com');
?>
3. В этой же папке include создайте файл с именем url_factory.inc.php и добавьте
в него функции _prepare_url_text() и make_product_url ( ) , как показано
в следующем листинге:
<?php
// включение конфигурационного файла
require_once 'config.inc.php';
// подготовка строки к занесению в URL
function _prepare_url_text ($string)
{
//удаление всех символов за исключением a-z, 0-9, тире, подчеркиваний и пробелов
$NOT_acceptable_characters_regex = '#[A-a-zA-Z0-9_ ]#';
$string = preg_replace ($NOT_acceptable_characters_regex, ' ' , $stri.ng) ;
// удаление начальных и конечных пробелов
$string = trim($string);
// замена всех дефисов, подчеркиваний и пробелов дефисами
$string = preg_replace ('#[-_]+#', ' -' , $string) ;
// возврат измененной строки
return $string;
}
// создание ссылки, содержащей категорию и продукт
function make_category_product_url($category_name, $category_id,
$product_name, $product_id)
{
// подготовка имени продукта и категории для вставки в URL
$clean_category_name = _prepare_url_text ($category_name) ;
$clean_product_name = _prepare_url_text($product_name);
// создание URL с ключевыми словами
$url = SITE_DOMAIN . ' /Products/' .
$clean_category_name . 1 -C' . $category_id . ' /1 .
$clean_product_name . 1 -P' . $product_id . '.html';
// возврат URL
return $url;
}
?>
4. В папке seophp создайте файл с именем c a t a l o g . php и следующим содержимым:
<?php
// загрузка библиотеки генератора ссылок
require_once 'include/url_factory.inc.php';
?>

HaBopo4eHHbni магазин SEO

<Ь1>Продукты, предлагаемые в навороченном магазине SEO

5. Вы используете файл product.php , созданный в предыдущем упражнении. Вот
его код для справки:
<?php
// вывод информации о продукте
echo ' Вы выбрали продукт №' . $_GET [' product_id' ] .
' из категории №' . $_GET['category_id'];
? >
6. Добавьте в файл .htaccess одно последнее правило:
RewriteEngine On
# Подмена числовых URL-адресов
RewriteRule AProducts/C([0-9]*)/Р([0-9]*)\.html$
Ч>/product.php?category_id=$l&product_id=$2 [L]
# Подмена URL-адресов с ключевыми словами
RewriteRule "Products/.*-С([0-9]+)/.*-Р([0-9]+)\.html$
•^/product.php?category_id=$l&product_id=$2 [L]
# Подмена catalog.html
RewriteRule лcatalog.html$ /catalog.php [L]
7. Введите в адресную строку браузера http://seophp.example.com/catalog .
html. Вы должны увидеть страницу, похожую на приведенную на рис. 3.14.
8. Щелкните на одной из ссылок и проверьте, что подмена правильно загружает
сценарий product.php, как показано на рис. 3.15.
9. Просто так, или если вы хотите освежить в памяти, как работает сценарий
product.php,введите адрес http://seophp.example.com/product .
php?category_id=6&product_id=31. Вы должны увидеть ту же информацию,
что и на рис. 3.15, но на этот раз с помощью динамического URL.
Поздравляем! Вы только что реализовали очень организованную и мощную стратегию,с помощью которой можно выполнять подмену всех URL в вашем каталоге — а,кроме того, вы реализовали схему подмены URL, благодаря которой все и работает.
Давайте поэтапно проанализируем написанный вами код, начиная с функции
_prepare_url_text( ) . Эта функция готовит строку (название продукта или категорию)
для включения в URL. Для этого она удаляет или заменяет дефисами все символы,которые недопустимы или просто портят внешний вид URL. Все алфавитно-цифровые символы остаются без изменений. Например, если функции передается вкачестве параметра строка "Friends' Shed", она заменяется на "Friends-Shed".
Функция _prepare_url_text () вначале удаляет с помощью _prepare_url_text ()
все символы, которые не являются алфавитно-цифровыми, дефисом, пробелом или подчеркиванием — чтобы не осталось символов, которые могут разорвать URL:
// удаление всех символов за исключением a-z, 0-9, тире, подчеркиваний и пробелов
$NOT_acceptable_characters_regex = '#[A-a-zA-Z0-9_ ]#';
$string = preg_replace($NOT_acceptable_characters_regex, '', $string);
РНР-функция preg_replace () выполняет манипуляции со строками с помощью
регулярных выражений. Исходная строка передается в третьем параметре. Функция заменяет фрагменты строки, соответствующие регулярному выражению, передаваемому в первом параметре, строкой, передаваемой во втором параметре. В данном случае регулярное выражение [ A-a-zA-Z0-9_ ] соответствует всем символам, которые не совпадают (А) с буквами, цифрами, дефисами, подчеркиваниями или пробелами. Соответствующие этому шаблону символы заменяются пустой строкой (' ') — т.е. удаляются. Символ диеза (#), окаймляющий регулярное выражение, является символом-ограничителем, который необходимо использовать с регулярными выражениями в РНР-функциях.
Затем РНР-функция trim () удаляет из строки, передаваемой ей в качестве параметра, все начальные и конечные пробелы:
// удаление начальных и конечных пробелов
$string = trim($string);
И, наконец, еще раз вызывается preg_replace () для преобразования в дефисы
всех групп пробелов, дефисов и подчеркиваний. Например, строка SE0 Toolbox
(содержащая три символа подчеркивания), заменяется на SEO-Toolbox. После этого возвращается преобразованная строка URL:
// замена всех дефисов, подчеркиваний и пробелов дефисами
$string = preg_replace('#[-_ ]+#', $string);
// возврат измененной строки
return $string;
Вот пара примеров таких преобразований:
// выводит Carpenters-Tools
echo _prepare_url_text("Carpenter's Tools");
// выводит Black-and-White
echo _prepare_url_text("Black and White");
Функция _prepare_url_text () используется функцией make_categoryjproduct_url ()
для создания URL-адресов продуктов. Функция make_category_product_url () принимает в качестве параметров категорию, название продукта, идентификатор категории и идентификатор продукта и на основе этих данных создает URL с ключевыми словами.
Код этой функции довольно прост. Он начинается с вызова _prepare_url_text (),
который подготавливает название продукта и категорию для вставки в URL:
// создание ссылки, содержащей категорию и продукт function make_category_product_url($category_name, $category_id,
$product_name, $product_id)
{
// подготовка имени продукта и категории для вставки в URL
$clean_category_name = _prepare_url_text($category_name);
$clean product name = prepare url text($product name);
Затем все эти строки объединяются в строку вида . /Products/Категория-Cm/
Название-продукта/Pn. html. И, наконец, эта строка возвращается в качестве результата:
// создание URL с ключевыми словами
$url = SITE_DOMAIN . '/Products/' .
. $category_id . '/' .
$product_id . '.html';
$clean_category_name . '-C
$clean_product_name . 1-p'
// возврат URL
return $url;
}
Вот примеры применения этой функции и ее результаты:
// Выводит /Products/Carpenters-Tools-C12/Belt~Sander-P45.html
echo make_product_url("Carpenter's Tools", 12, 'Belt Sander', 45);
// Выводит /Products/Hammers-C3/Big-and-Mighty-Hamitier-P4 .html
echo make_product_url('Hammers', 3, 'Big and Mighty Hammer', 4);
В приложение Web-сайта необходимо добавить функцию make_product_url ().
Потребуется заменить все фрагменты кода приложения, где выводятся URL-адреса.
Например (если следующие переменные относятся к информации базы данных о продукте):
echo "/products.php?category_id=$category_id&product_id=$product_id";
Подобные фрагменты следует заменить на echo make_product_url($category_name, $category_id, $product_name, $product_id);
Мы показали, как это можно сделать, с помощью создания фиктивной страницы
каталога Web-сайта электронной коммерции catalog.php, и мы даже создали правило подмены, чтобы она была доступной с помощью' статического URL.
В реальном Web-сайте название продукта, категория и идентификаторы должны
выбираться из базы данных, но для упрощения данного упражнения мы просто вводили их вручную.
<а href="<?php echo make_category_product_url("Carpenter's Tools", 12,
">
Carpenter's Tools: Belt Sander
- Инструменты столяра: Ленточная шлифовка

Разбиение на страницы и подмена URL
Подмена изображений и потоковых носителей
Проблемы, которые подмена не может решить
Последнее предостережение
Резюме
Используются технологии uCoz