часть 3
Это третье логическое продолжение публикаций "Практическое применение PERL-скриптов и "Построение сайта по единому шаблону, часть 2".
Если Вы создали динамический сайт, то скорее всего адреса страниц выглядят не самым лучшим образом. Я бы сказал очень недружественно по отношению к пользователю.
Напомню, в предыдущих статьях получен следующий результат: дизайн Вашего сайта описан в одном файле-шаблоне, в который, в необходимые места вставляется информация из других страниц в зависимости от строки запроса URL.
Адреса Ваших страниц при этом выглядят следующим образом: "http://my.site/shablon.shtml?page.htm" или "http://my.site/?page" если файлом шаблона является индексный файл, а расширение ".htm" вы автоматически добавляете ко всем вставляемым страницам. Еще более недружественным является вариант, часто встречающийся в интернете: "index.php?page=27".
Согласитесь, что намного приятней наблюдать и набирать адрес: "http://my.site/page.htm" нежели "http://my.site/?page.htm", тем более запомнить к чему относится "http://my.site/index.php?page=27". Я хочу сказать, что адрес страницы сам по себе должен нести смысловую нагрузку, быть интуитивно понятным посетителю Вашего сайта. К примеру, адрес "http://my.site/photo/cars/bmw/z8" более чем красноречиво говорит куда Вы попадете.
Выход из создавшейся ситуации есть. У вэб-сервера Apache есть модуль "mod_rewrite". И некоторыми из его возможностей мы и воспользуемся.
Для начала необходимо убедится, что данный модуль используется на Вашем сервере. Если Вы используете PHP то просто выполните скрипт <? phpinfo(); ?> и убедитесь что среди загруженных модулей есть mod_rewrite. В противном случае уточните возможность использования этого модуля у администратора хостинга, где Вы держите сайт.
Далее в файл .htaccess добавляем следующие инструкции:
RewriteEngine on
RewriteRule !\.(gif|jpg|zip|js)$ /my.site/index.php
Разберем инструкции:
RewriteEngine on - включить модуль, грубо говоря разрешить ему работать
RewriteRule !\.(gif|jpg|zip|js)$ /my.site/index.php - описание правила,
согласно которому все запросы перенаправляются файлу index.php,
за исключением файлов с расширениями: gif, jpg, zip и js.
При этом /my.site/index.php - полный физический путь на сервере к файлу который будет обрабатывать все перенаправляемые запросы.
Зачастую этот пут очень причудлив: "/www/users/oleg/www.mysite.com/htdocs/index.php".
Поэтому обязательно его уточните. :)
Итак, пол дела сделано, все запросы перенаправляются одному файлу, и в нашем случае это файл-шаблон. Осталось только привести пример обработки запроса, чтобы Вы могли воспользоваться всем выше описанным.
Магический код в файле-шаблоне, пример на PHP:
<?
if (!(file_exists($DOCUMENT_ROOT.$REQUEST_URI))) $url="/404.htm";
else $url=$REQUEST_URI;
include($DOCUMENT_ROOT.$url);
?>
В первой строке производим проверку наличия запрашиваемого файла, если его нет, то переменной имени файла присваевается имя 404.htm (сообшение о 404-ой ошибке, файл не найден). В противном случае во второй строке переменной присваевается имя запрашиваемого файла. В третьей строке в файл-шаблон вставляется запрашиваемый документ, если он найден, либо 404 страничка в случае ошибки.
Вот и все. Теперь при запросе страницы "http://my.site/links.htm", она будет автоматически вставлена в файл index.php, который в нашем случае является файлом-шаблоном.
Но сразу оговорюсь,
что приведенный фрагмент кода лишь демонстрация работы предложенного метода.
В частности, необходимо избежать рекруссии.
То есть если пользователь введет безобидный на первый взгляд адрес "http://my.site/index.php".
Произойдет вставка файла-шаблона самого в себя, вставленный фрагмент опять вставит себя и так до бесконечности.
Чтобы избежать этого необходимо произвести проверку, не является ли запрашиваемый файл нашим скриптом (пример на PHP):
($SCRIPT_FILENAME!=$DOCUMENT_ROOT.$REQUEST_URI)
Если же для создания своего динамического сайта Вы используете базы данных MySQL, то код обработки URL будет совершенно иной. Его обсуждение выходит за рамки данной статьи.
Действие директив модуля "mod_rewrite" распространяется и на все вложенные директории, начиная с той в в которой находится файл .htaccess.
То есть если он лежит в корне сервера, то распространяет свое влияние на весь сервер.
И чтобы, к примеру, исключить папку "stats" от обработки через наш файл-шаблон необходимо модернизировать .htaccess следующим образом:
RewriteEngine on
RewriteRule ^stats/.*$ - [L]
RewriteRule !\.(gif|jpg|zip|js)$ /my.site/index.php
Новое правило во второй строке исключает папку "stats" из обработки и останавливает дальнейшее исполнение инструкций файла .htaccess.
В статье не рассмотрены все варианты использования модуля "mod_rewrite", которые не ограничиваются вышеописанным в статье. За дополнительной информацией необходимо обратиться к документации вэб-сервера APACHE.