ЧПУ без mod_rewrite
Версия для печати | Содержание раздела
Пишем систему для реализации человеко-понятного URL’я. Данный способ предназначен только для извращенцев и тех, у кого на хостинге отсутствует поддержка модуля mod_rewrite. Описанная система работает на даном сайте уже около двух лет.
Вступление (или «Листать вниз»)
Когда-то сайты были просты. Пара HTML-ей, ссылки между ними, иногда парочка картинок — gif-файлов. Проблема внешнего вида URL таких страниц возлагалась полностью на плечи автора (как назовет он файлы и каталоги, так и будут выглядеть адреса страниц и разделов).
С появлением и распространением серверных языков программирования пришла беда — «сайты-однофайлы» или «сайты на основе “index.php”». Это — когда весь сайт состоит из одного файла-скрипта (index.php), весь контент хранится в базе и выбирается по набору критериев из GET-запроса (строки параметров, идущей после знака вопроса). Однако, при этом все URL приобрели совершенно уж непотребный вид. Всякие http://some-site.com/index.php?page=4§ion=2 и
http://some-site.com/index.php?p=htmltags&s=help заполонили просторы сети.
Для спасения от такой беды в апреле 1996 для популярного сервера Apache изобрели модуль “mod_rewrite” — он умеет (если его научить) по некоторым правилам преобразовывать нормального вида адрес в реальное обращение к вашему index.php. Если вас интересуют подробности работы модуля, читайте например здесь.
Теперь стало возможным, не отказываясь от системы с одним файлом, делать красивые URL. Вместо плохих (не понятных человеку):
http://some-site.com/index.php?page=4§ion=2
...стало возможным делать нормальные URL’и
(так выглядят они например на этом сайте):
http://some-site.com/help/?htmltags
... или совсем хорошие:
http://some-site.com/help/htmltags
Смогли бы вы догадаться по первому примеру, что это адрес страницы — статьи про HTML-теги из раздела сайта «помошь»? Думаю, вряд ли (кроме случаев, если вы когда-либо сами делали точно такую же систему). А второй и третий примеры вполне прозрачны в этом плане. Единственным недостатком второго варианта в сравнении с третьим является разве только то, что последний елемент отделен не слешем (косой чертой) а знаком вопроса.
Нашей задачей сегодня будет создание второго (нормального) типа адресов. (Создать совсем хорошие урли без mod_rewrite можно, но это довольно хлопотно).
Основная идея
Основная идея заключается в следующем. Для каждого раздела создается свой каталог в веб-дереве, и в него лóжится индексный файл (по умолчанию обычно “index.php”). Внутри всех этих файлов есть только вызов одного и того же внешнего скрипта, который и делает всю работу.
А работа состоит в чтении GET-запроса, вся строка которого и является названием (идентификатором) матерала данного раздела.
Реализация основного скрипта
Получить строку GET-запроса можно из переменной $_SERVER["QUERY_STRING"].
$artname = $_SERVER["QUERY_STRING"];
После этого могут идти любые манипуляции с полученным именем. Например, по полученному идентификатору вызывать из базы статью, либо читать её из файла.
Например, рассмотрим дополнительно реализацию ссылки “версия для печати” (такую как на этом сайте). Ссылка будет иметь вид:
http://site.com/section/?somearticle/print
Чтобы обрабатывать такой случай обращения к статье, нужно всего лишь проверять, присутствует ли в $artname строка “/print”, и если она там есть, то вырезать её из $artname (чтобы переменной можно было пользоваться дальше) и сделать действия, соответствующие версии для печати (подгрузить нужный шаблон, дописать ко всем текстовым ссылкам в скобках их href'ы и прочее).
Вообщем-то, ничего сложного.
3.09.2005
|