Быстрая CMS
Обратная связь Карта сайта
Главная Создание сайтов Практика Строим CMS Наивное О проекте Блог

Псевдостатика средствами PHP-скрипта

Второй вариант обработки псевдостатических ссылок делается средствами PHP. Он не требует написания цепочки правил для mod_rewrite, но также использует этот модуль – с одним-единственным правилом. Смысл в том, что при любом вызове вместо вызываемого адреса подставляется специально написанный скрипт, который анализирует вызываемый URL, вычленяет из него параметры и передает управление уже скрипту движка. Слова «передает управление» здесь не вполне корректны, поскольку наш скрипт-анализатор просто подключает скрипт движка директивой include.

Небольшое объяснение для тех, кто не вполне понял, как это возможно. Модуль mod_rewrite подменяет вызываемый URL по правилам, прописанным для него в локальных настройках (обычно в файле .htaccess). Он в этом случае не производит перенаправление, а просто передает веб-серверу в обработку другой адрес вместо запрошенного. Для пользователя это незаметно, URL в адресной строке остается прежним, это «внутренние дела» сервера. Если при этой «подмене» формируется новый URI с GET-параметрами, то в переменных окружения сервера появятся эти GET-параметры, а вся строка параметров появится в переменной окружения QUERY_STRING. Но исходный запрос сохраняется неизменным в переменной REQUEST_URI. Именно оттуда его можно извлечь и разобрать – но уже средствами PHP. А URI для подмены не будет содержать вообще никаких параметров.

Правило для mod_rewrite в этом случае строится очень просто:


# Включаем преобразование URL
RewriteEngine on
# Назначаем базу преобразований
RewriteBase /

# Условие преобразования
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Правило преобразования
RewriteRule (.*) parse.php [L]

Как нетрудно догадаться, это означает: «Если запрашивается не существующий файл или директория, URI, состоящий из любого количества любых символов, заменить на parse.php». В данном случае скрипт-анализатор у нас носит имя parse.php. И дальше обработкой запроса будет заниматься именно он. Такой скрипт разбирает исходный URL на составные части с применением функций регулярных выражений – фактически работает тот же самый механизм, что и в обработке псевдостатики правилами mod_rewrite, только разборкой занимается скрипт-анализатор. Он создает нужные переменные и вызывает скрипт движка, который собирает страницу в соответствии со значениями этих переменных – ему уже не нужно создавать их из GET-параметров.

Такой подход хорош в случае сложного «коробочного» движка, в котором формированием страниц занимается не один скрипт, а несколько. Например, так работает известный модуль vbSEO для форума vBulletin – кроме всего прочего он занимается еще и разборкой псевдостатических ссылок.

Теперь попробуем сделать такое же преобразование псевдостатических ссылок, как и в предыдущей статье «Псевдостатика на базе правил mod_rewrite».

На этот раз нам уже не нужно создавать GET-параметры – скрипт получит запрошенный URI и будет разбирать его с помощью регулярных выражений (без них нам все-таки никак не обойтись). Вот в простейшем виде подобный скрипт:


<?php
// Извлекаем URI, отсекаем слэш в начале
$uri=substr($_SERVER['REQUEST_URI'],1);
// Шаблон для разбора URI
$pat="/([a-z0-9]+)([-]?)([0-9]*).html/";
if (preg_match($pat,$uri,$match)) {
  if (!empty($match[1])) $id=$match[1];
  if (!empty($match[2])) $pg=(int)$match[3];
  // Параметры есть, подключаем главный скрипт
  include('./index.php');
} else {
  header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
  // Здесь делаем вывод страницы с сообщением об ошибке
  // ...и прекращаем работу скрипта
  exit;
}
?>

Все довольно просто – если URI соответствует маске, preg_match() вычленяет из него три части и сохраняет в массиве $match. При этом в нулевом элементе массива сохраняется весь URI, а в элементах 1–3 – захваченные паттерны. В первом алиас страницы, во втором дефис, если он есть, в третьем числовой параметр. Они и будут значениями параметров для движка. Если в ссылке нет дефиса и цифр после него, второй и третий паттерны отсутствуют, тогда второй и третий элементы массива будут пусты. Это признак того, что страницу нужно искать только по алиасу, дополнительного числового параметра нет.

При успешном разборе URI можно подгружать основной скрипт и пусть он дальше занимается выборкой данных и формированием страницы. А если вместо корректной ссылки ввели что-то не соответствующее шаблону, можно сразу отдать заголовок «404 Not Found» и прекратить работу, не расходуя зря ресурсы сервера на неверный запрос.

Возможен еще более простой способ преобразования и в некоторых движках он применяется. Для каждой новой страницы вводится желаемый «человекопонятный» URI и сохраняется в базе. Тогда без применения регулярных выражений контент страницы можно легко выбирать из базы по этой строке. Но это годится только для самых простейших движков.