Изменение имен файлов с помощью перенаправлений

В приведенном ниже упражнении вы измените страницы продуктов, созданные в
главе 3, чтобы перенаправить все динамические URL на их версии с ключевыми словами.
Пока один и тот же контент можно получить и с помощью динамических URL,
и с помощью URL-адресов с ключевыми словами (см. рис. 3.9 и 3.12 в главе 3). К примеру, следующие две ссылки выдадут один и тот же контент:
http://seophp.example.com/Produots/SEO-Toolbox-C6/Link-Juice-P31.html
и http://seophp.example.com/product.php?oategory_id=6&product_id=31
Чтобы избежать проблем из-за наличия двух ссылок, генерирующих этот дублированный контент, при наличии другого URL нужно обязательно перенаправлять посетителя на нужный URL с ключевыми словами. Это очень важно во время перехода на такие URL на уже существующем Web-сайте, т.к. старые URL-адреса наверняка уже проиндексированы.
Ну ладно, вы уже наверняка с нетерпением ждете, когда мы начнем писать код!
Перенаправление динамических URL на URL-адреса с ключевыми словами.
1. Добавьте в файл include\config. inc.php приведенный ниже код. Глобальные
ассоциативные массивы определяют линейку продуктов и категорий, как в реальной базе данных продуктов. Данные из этих массивов нужны для автоматической генерации версий URL-адресов с ключевыми словами, который будет выполняться в PHP-коде. (Массивы используются вместо реальной базы данных, чтобы не загромождать упражнение.)
<?php
// домен сайта; конечный '/' не нужен!
define('SITE_DOMAIN', 1http://seophp.example.com');
// создание фиктивной базы данных с продуктами и категориями
$GLOBALS['products'] = array
("45" => "Belt Sander",
"31" => "Link Juice",
"42" => "AJAX PHP Book");
$GLOBALS['categories'] = array
("12" => "Carpenters Tools",
"6" => "SEO Toolbox",
»2" => "Friends Shed") ;
?>
2. Создайте файл include/url_redirect. inc.php и введите в него следующий
код:
<?php *
// загрузка библиотеки генератора URL
require_once 'url_factory.inc.php';
// перенаправление на нужный URL, если это не он
function fix_category_product_url ()
{
// выборка нужного URL из текущей страницы категория/продукт
$proper_url = get_proper_category_product_url () ;
// при необходимости перенаправление 301 на нужный URL
if (SITE_DOMAIN . $_SERVER['REQDEST_DRI'] != $proper_url)
{
header (' HTTP/1.1 301 Moved Permanently') ;
header('Location: ' . $proper_url);
exit() ;
}
}
// возвращает нужный URL с ключевыми словами
function get_proper_category_product_url ()
{
// выборка ID продукта и категории из строки запроса
$product_id = $_GET[ 'product_id' ] ;
$category_id = $_GET [' category_id' ] ;
// выборка названий продукта и категории из фиктивной базы данных
$product_name = $GL0BALS['products' ] [$product_id] ;
$category_name = $GL0BALS [' categories' ] [$category_id] ;
// создание URL с ключевыми словами
$proper_url = make_category_product_url ($category_name, $category_id,
$product_name, $product_id);
// перенаправлние на URL с ключевыми словами, если это не он
return $proper_url;
}
?>
3. Добавьте в product. php следующие строки:
<?php
// загрузка библиотеки для обработки перенаправлений
require_once 'include/url_redirect.inc.php';
// перенаправление на нужный URL с ключевыми словами, если это не он
fix_category_product_url();
// вывод информации о продукте
echo 'Вы выбрали продукт №' . $_GET['product_id'] .
' из категории №' . $_GET [' category_id' ] ;
?>
4. Откройте в браузере страницу http://seophp.example.com/product.
php?category_id=2&product_id=42 и посмотрите, какое чудо произошло с
URL! На рис. 4.4 показано, как этот запрос перенаправлен на версию URL с
ключевыми словами ("нужную").
Все началось с изменения product.php: в него была включена ссылка на файл
u r l r e d i r e c t . inc .php, а затем из него.была вызвана функция f ix_category_
product_url():
<?php
// загрузка библиотеки для обработки перенаправлений
require_once 'include/url_redirect.inc.php';
// перенаправление на нужный URL с ключевыми словами, если это не он
fix_category_product_url();
Функция fix_category_product_url () выполняется при каждой загрузке страницы
продукта и проверяет, является ли URL доступа к странице "нужным". "Нужная"
версия URL составляется с помощью вспомогательной функции get_proper_
category_product_url():
// перенаправление на нужный URL, если это не он
function fix_category_product_url()
// выборка нужного URL из текущей страницы категория/продукт
$proper_url = get_proper_category_product_url();
Как работает get_proper_category_product_url ( ) , будет объяснено чуть ниже.
А пока просто скажем, что переменная $proper_url содержит что-то вроде http: / /
seophp.example.com/Products/Friends-Shed-C2/AJAX-PHP-Book-P42.html. Сразу
после получения этого "нужного" URL выполняется проверка, совпадает ли он с URL-адресом, использованным посетителем для входа на страницу продукта:
// при необходимости перенаправление 301 на нужный URL
if (SITE_DOMAIN . $_SERVER['REQUEST_URI'] != $proper_url)
{
Выражение $_SERVER [' REQUESTURI
1 ] возвращает URL, который был использован
для входа на страницу (без доменного имени). Например, при вводе адреса http: //
seophp.example.com/product.php?category_id=2&product_id=42 значением выражения
$_SERVER['REQUEST_URI'] будет /product.php?category_id=2&product_
id=42. Полный URL можно получить, добавив к этому значению доменное имя.
При несовпадении выполняется перенаправление 301 на нужный URL. Для этого
устанавливаются необходимые значения заголовков:
// при необходимости перенаправление 301 на нужный URL
if (SITE_DOMAIN . $_SERVER['REQUEST_URI'] != $proper_url)
{
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $proper_url);
exitO ;
}
Теперь рассмотрим функцию get_proper_category_product_url ( ) . Она начинается
с загрузки идентификаторов продукта и категории, переданных через URL, в
переменную $_GET:
// возвращает нужный URL с ключевыми словами
function get_proper_category_product_url()
{
// выборка ID продукта и категории из строки запроса
$product_id = $_GET['product_id'];
$category_id = $_GET['category_id'];
Затем из фиктивной базы данных вводятся названия продукта и категории:
II выборка названий продукта и категории из фиктивной базы данных
$product_name = $GLOBALS['products'][$product_id];
$category_name = $GL0BALS['categories'][$category_id];
Эта фиктивная база данных состоит из двух глобальных ассоциативных массивов,
которые связывают идентификаторы с названиями. Они определены в файле
config.inc.php и моделируют реальную базу данных о продуктах. Ассоциативные
массивы в данном примере используются для простоты. А в реальной ситуации, конечно, нужна настоящая база данных.
// создание фиктивной базы данных с продуктами и категориями
$GL0BALS['products'] = array
(«45" => "Belt Sander",
"31" =>' "Link Juice",
"42" => "AJAX PHP Book");
$GL0BALS['categories'] = array
("12" => "Carpenters Tools",
"6" => "SEO Toolbox",
»2" => "Friends Shed");
Теперь, получив все необходимые данные, функция get_proper_category_
producturl () создает URL с ключевыми словами с помощью функции make_
category_product_url () генератора URL:
/ / создание HRL с ключевыми словами
$proper_url = make_category_product_url($category_name, $category_id,
$product_name, $product_id);
И, наконец, функция возвращает это значение:
// перенаправлние на URL с ключевыми словами, если это не он
return $proper_url;