Имитация файлов и директорий
DL
16.1.2001
Адрес вашего сайта появляется на пользовательском экране одновременно с дизайном и контентом. Поэтому адрес является полноправной частью сайта. Адрес типа www.фирма.ру (www.фирма.город.ру), естественно, гораздо лучше, чем www.geocities.com/Gonduras/San-Pedrillio/~наша_фирма, кто спорит. А вот по вопросу понятных человеку адресов внутри сайта общественность четкого консенсуса пока не нашла.
Однако пользователю приятнее было бы видеть адрес типа /services/special/ чем /content.phtml?q=e23908a234cc239b3445127.
Лирическое отступление. Помню, на Интернити-99 мне показали флэш-ролик [] Laser Jet 3100. Через пару недель я вспомнил про него и решил скачать его из дома. Я бы долго бродил в бесполезных поисках по сайту [] (чего вы смеетесь, это так и было!), если бы не их адреса. На HP адреса были понятные? что-то вроде "/products/printers/laserjet/3100", а на сайте Лексмарка было вот именно это непонятное "q=492898748273". Я был в сомнениях, но через день вспомнил-таки, что это был HP :).
Кстати, на этом сайте адреса выпусков, версий для печати и всех информационных страниц (ссылки, файлы и т.д.) виртуальные, файлов с такими названиями не существует.
Делается это достаточно просто. В файле .htaccess пишутся строчки, например
ErrorDocument 404 all.php
ErrorDocument 403 all.php
ErrorDocument 401 all.php
Файл all.php обрабатывает переменную $REQUEST_URI и, если нужная информация найдена, выдет команду
header ("HTTP/1.0 200 Ok");
Это необходимо для того, чтобы броузер IE 4 считал, что страница найдена, а не подставлял вместо нее свою служебную вывеску "адрес не найден". В остальных случаях, даже если запрошен адрес "all.php", пользователю будет выдаваться сообщение о том, что файл не найден.
Если при вызове функции header сервер ругается матом "Error 500" - смотрите [] и [].
Конечно же, выдать заголовок и нарисовать страницу ? нехитрое дело. Отслеживание результатов запросов, проверка на ошибки ? это скорее рутина. Самое ответственное дело ? разбор запрашиваемого адреса.
Что такое title и rub_text ? объяснять не надо. Поле address ? это адрес, по которому будет запрашиваться рубрика (новости нужно сделать рубрикой первого уровня, и в поле address будет "news"). Поле parent_id ? идентификатор рубрики уровнем выше.
Теперь, если рубики заведомо не могут быть ниже второго уровня, анализ адреса не составит особого труда.
$url = $REQUEST_URI;
// убираем слэши из начала и конца адреса
$url = ereg_replace("^/", "", $url);
$url = ereg_replace("/$", "", $url);
$dir = explode("/", $url)
// случай, когда запрошена рубрика второго уровня.
if (sizeof($dir)==2) {
// составляется запрос, объединяющий таблицу rubrika саму с собой. Здесь надо заметить только, что таблица first подразумевает рубрику второго уровня, а second, наоборот, первого.
$request = "SELECT first.id, first.title, first.rub_text FROM rubrika first, rubrika second WHERE first.parent_id=second.id AND first.address='". $dir[1]. "' AND second.address='". $dir[0]. "'";
// Отправляем запрос в базу, а потом обрабатываем результат.
$result = mysql_query($request);
if (!mysql_error() && @mysql_num_rows($result)==1) {
}
// Это на случай, если запрос прошел успешно, но ничего не найдено
elseif (!mysql_error()) {
}
// ...и на случай, если произошла ошибка.
else
die ("Ошибка БД. MySQL пишет: ". mysql_error());
}
// Запрошена рубрика первого уровня. тут и делать-то нечего :)
elseif (!ereg("/", $url)) {
$request = "SELECT id, title, rub_text FROM rubrika WHERE address='$url'";
...
};
Хватит примеров? Дальше ? дело фантазии. Подведем итоги, распишем положительные и отрицательные моменты.
+ Красивые адреса, возможность зайти в рубрику, набрав ее адрес на клавиатуре. Благодарность от фанатов клавиатуры.
+ Уменьшение количества файлов, уменьшение количества повторяющихся операций в разных файлах.
+ Централизация вывода. Сбор большинства операций в единой точке входа.
+ Скрытие некоторой технологической части сайта.
- Увеличение ресурсоемкости за счет проверки адреса и компиляции большого файла вместо нескольких маленьких.
- Сложность с введением новых параметров (я, можно сказать, удачно вывернулся с версией для печати, но было бы более логично видеть адреса типа /13/print). Кое-что придется сбрасывать, например в куки.
- Кое-что, например, поиск, так и останется вне "точки входа" (хотя... "" [] делает поиск в адресе, но для более-менее сложного сайта это будет неудобно или невозможно).
- Дополнительные сложности с адресами картинок и навигации по сайту (броузер-то мерит все адреса относительно открытого документа, пусть даже из несуществующего адреса).
Итак, что мы получаем в итоге? Красота, даже адресов, требует жертв.
Напоследок: в этом выпуске я использовал кучу регулярных выражений, поэтому (и по просьбам читателей) обещаю в скором времени затронуть эту тему.