Принтабельные ссылки
[04.09.2005]

Сегодня напишем на модном javascript’e приблуду, добавляющую в версии для печати ко всем ссылкам в тексте их href’ы.

Фотомонтажим на PHP
[10.04.2005]

Возвращаясь к теме работы с изображениями в PHP, рассмотрим реализацию «смешивания» изображения из нескольких картинок, и способы практического применения такого трюка.

Отправка и обработка ответов http-запросов с помощью JavaScript (использование объекта XMLHttpRequest)
[22.03.2005]

Разберёмся с возможностями, которые предоставляет нам объект XMLHttpRequest. Попробуем реализовать на JavaScript работу с удаленным сервером посредством прямой отправки http-запросов и обработкой ответов.

Работа с изображениями в PHP (часть вторая)
[07.12.2004]

Продолжая тему, сегодня поговорим о шрифтах и работе с текстом в изображениях и разберемся, как писать в графике «по-русски».

Работа с мышиным курсором в JavaScript. Часть третья.
[25.07.2004]

Сегодня мы продолжим издеватся над несчастным мышиным курсором и попытаемся создать эффект «волшебной палочки», из которой сыплются частицы «волшебной пыли».

ЧПУ без mod_rewrite

Версия для печати | Содержание раздела

Пишем систему для реализации человеко-понятного URL’я. Данный способ предназначен только для извращенцев и тех, у кого на хостинге отсутствует поддержка модуля mod_rewrite. Описанная система работает на даном сайте уже около двух лет.

Вступление (или «Листать вниз»)

Когда-то сайты были просты. Пара HTML-ей, ссылки между ними, иногда парочка картинок — gif-файлов. Проблема внешнего вида URL таких страниц возлагалась полностью на плечи автора (как назовет он файлы и каталоги, так и будут выглядеть адреса страниц и разделов).

С появлением и распространением серверных языков программирования пришла беда — «сайты-однофайлы» или «сайты на основе “index.php”». Это — когда весь сайт состоит из одного файла-скрипта (index.php), весь контент хранится в базе и выбирается по набору критериев из GET-запроса (строки параметров, идущей после знака вопроса). Однако, при этом все URL приобрели совершенно уж непотребный вид. Всякие http://some-site.com/index.php?page=4&section=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&section=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