Сайт по кирпичикам или все о SSI.
Перед любым мало-мальски серьезным сайтостроителем рано (гораздо лучше) или поздно (опыт - сын ошибок трудных) встает проблема уменьшения ручной работы, унификации кода сайта и вообще... Вполне резонное желание делать поменьше, а результат получать быстрее упирается только в возможность - как это сделать?Перед любым мало-мальски серьезным сайтостроителем рано (гораздо лучше) или поздно (опыт - сын ошибок трудных) встает проблема уменьшения ручной работы, унификации кода сайта и вообще... Вполне резонное желание делать поменьше, а результат получать быстрее упирается только в возможность - как это сделать?
И тут на помощь может придти довольно простой, но в то же время чрезвычайно мощный инструмент. Имя ему - Server Side Includes, сокращенно - SSI. Наиболее естественно и полно поддержка SSI традиционно реализована в web-сервере Apache, впрочем и во всех остальных Web-серверах (Netscape, MS IIS и проч.) она тоже наличествует.
Для чего может быть полезен SSI? Самый простой пример. Предположим, решил ты, знатный наш перец, удивить мир своим сайтом. Все бы хорошо, да вот только FrontPage издох, хомяк (HomeSite) умер с перепоя и остался ты один в этом мире, одинешенек. Одна надежда, что ручки шаловливые выведут. И они таки выведут. Но только в том случае, если сайт не большой или обновления на сайте - раз в пятилетку. Правда, это уже не сайт, а похоронная контора, но об этом позже. Сайт должен быть большим, интересным, живым и обновляемым.
Довольно распространенной (притом очень вежливой и разумной) считается манера размещать управляющее меню сайта на каждой странице. Естественно, что вид этого меню может быть сколько угодно прихотливым - главное, чтобы это меню присутствовало на всех страницах! Кроме того, очень бы хорошо еще и баннерную рекламку крутить, да еще кнопочки дружественных сайтов забабахать, да еще... короче - не перечесть.
А теперь представь себе кошмар, когда один раздел добавился, а другой умер, баннерную сеть надо срочно менять, а с другом ты разругался в дребадан и его поганую кнопку (чтоб он всю жизнь во FrontPage Express сайты ваял) ты хочешь выкинуть с сайта раз и навсегда. При этом на сайте, ну, хотя бы с 50 страниц есть. Вопрос - сколько файлов в каждом случае придется изменять?
Неправильный ответ - 50. Правильный ответ - 1. Но только в том случае, если используются SSI.
Наверное, пора перестать темнить и рассказать, что к чему.
Да будет свет!
Все дело в том, что технология SSI позволяет вставлять в гипертекстовый документ "внешние" файлы. Т.е. - я делаю шаблон страницы, а в нем, с помощью однотипных команд, идет отсылка на несколько блоков - кирпичиков. Один блок служит - для заголовка, один - для меню, еще один - для кнопок, да еще два (побольше, побольше) - на рекламу. И так из этих кирпичиков страница и собирается.
Файлы, сделанные с применением SSI, обычно имеют расширение .shtml. "Лишняя" "S" в начале расширения говорит серверу, что в документе могут быть SSI инструкции. И сервер тогда их в состоянии грамотно обработать.
Таким образом получается, что к тому, кто страницы смотрит, уходит точно такой же объем кода, но при этом трудоемкость модификации и создания новых страниц для их автора заметно уменьшается.
Что ж, я нарисовал замечательную перспективу, но настырные голоса вопиют - "Show me the money", т.е. объясни, как же это все делается. Рассказываю...
Синтаксис 1
Главный оператор, которым придется пользоваться чаще всего - это "include". В общем случае SSI директива имеет вид: <!--#include virtual="myfile.txt"-->.
<!-- --> - это стандартный комментарий (если вдруг сервер не сможет распознать команду или не поддерживает ее, то она просто будет пропущена);
#include - собственно сама команда;
virtual - указывает на "вид" пути к файлу;
myfile.txt - имя вставляемого файла.
Естественно, что имя у включаемого файла может быть любым - с любым расширением (или без оного). Главное, - это "начинка" файла. Совершенно понятно, что это должен быть HTML.
Касательно "вида" пути (команда virtual). Если сервер проектируется для Web'a (скорее всего), то эта команда именно так и выглядит. Это, конечно, накладывает некоторые ограничения на то, чтобы удобно разместить вкладываемый файл. В этой команда нельзя применять гиперссылки (хотя это в любом случае дурной тон).
Однако иногда бывает полезно показать работу сайта непосредственно на "рабочем" компьютере, и тогда можно (нужно) использовать вместо virtual команду file. При этом адрес можно задавать в виде абсолютного адреса (C:VasyaPupkinSiteXXXmyfile.txt). Но это все-таки экзотика.
В общем случае на команде virtual и заканчивается общепринятое использование Server Side Includes - Включений на стороне сервера. И, наверное, это справедливо - что еще нужно знать, чтобы собирать сайт из кусочков?
Но для тех, кто понимает толк в сайтостроительстве, самое интересное начинается там, где останавливаются все остальные.
Так давайте на всю катушку использовать те возможности, которые дает SSI (а их, поверьте мне, не мало).
Синтаксис 2
Условно говоря, у SSI есть две большие области применения: первая - это вставлять внешние файлы, а вторая - вставлять так называемые "переменные окружения".
Делается это командой вида: <!--#echo var="echo_command"-->, где echo_command - переменная величина и может принимать порядка 30 значений. Все я толковать не буду (справочник по SSI можно найти на Web'е без труда), но самые важные - обязательно:
<!--#echo var="DOCUMENT_NAME"--> - выдаст на экран локальное имя текущего документа, к примеру: "ya_garni_peretz.htm" (очень полезен для тех, у кого частый склероз);
<!--#echo var="DOCUMENT_URL"--> - покажет локальный путь к документу, считая от корневой директории Web-сервера, т.е. адрес типа: /win/mydocs/ssi-tutor/baklan.htm.
<!--#echo var="DATE_LOCAL"--> - выведет текущие, локальные дату и время;
<!--#echo var="LAST_MODIFIED"--> - покажет дату последней правки текущего файла;
<!--#echo var="REMOTE_ADDR"--> - выведет ip вошедшего на страницу;
<!--#echo var="REMOTE_HOST"--> - выведет имя компьютера гостя. Очень простой трюк для определения - работает ли компьютер с использованием в настройках proxy: зайти на свою собственную страницу и прочитать адрес, полученный в ответ на команду REMOTE_HOST.
<!--#echo var="SERVER_SOFTWARE"--> - имя используемого провайдером HTTP сервера; иногда это бывает очень полезно знать;
<!--#echo var="SERVER_NAME "--> - имя компьютера, на котором работает web-сервер; тоже небезынтересно знать;
<!--#echo var="HTTP_USER_AGENT"--> - одна из самых любимых команд - позволяет определить тип браузера посетителя;
<!--#echo var="HTTP_REFERER"--> - показывает URL, откуда "клиент" пришел (иногда может быть полезна для того, чтобы определить "скрытый" адрес);
<!--#echo var="GATEWAY_INTERFACE"--> - фактически дает версию CGI ПО провайдера.
С помощью SSI, не прибегая к скриптам на Яве и прочим Общим Шлюзовым (cgi) прибамбасам, можно легко и непринужденно делать на странице сообщения типа:
Всем большой хай!
Сегодня у нас Sunday, 27-Feb-2000 20:30:07 Московское время (зима).
Последний раз этот документ был изменен Monday, 21-Feb-2000 23:00:00 MSK.
Твой IP адрес, незнакомец: 193.233.5.100
На моем сервере используется такое ПО, как: Apache/1.3.9 (Unix) PHP/3.0.6 mod_perl/1.16_02
Для просмотра ты, странник, используешь Mozilla/4.0 (compatible; MSIE 4.02; Windows NT). Must DIE! / Rulezzz forever!
А пришел ты сюда со странички: www.super-world-porno.com/uti-puti.htm.
Стоит показать такую страницу всем своим друзьям, как они тут же тебя убоятся. Шутка ли, столько о них узнать.
Для особо пытливых приведу полный список echo-команд (в алфавитном порядке): "ACCEPT_LANGUGE", "AUTH_TYPE", "DATE_GMT", "DATE_LOCAL", "DOCUMENT_NAME", "DOCUMENT_URI", "CONTENT_LENGTH", "CONTENT_TYPE", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_COOKIE", "HTTP_FORWARDED", "HTTP_FROM", "HTTP_REFERER", "HTTP_USER_AGENT", "LAST_MODIFIED", "PATH_INFO", "PATH_TRANSLATED", "QUERY_STRING", "QUERY_STRING_UNESCAPED", "REMOTE_ADDR", "REMOTE_HOST", "REMOTE_IDENT", "REMOTE_USER", "REQUEST_METHOD", "SCRIPT_NAME", "SERVER_NAME", "SERVER_PORT", "SERVER_PROTOCOL", "SERVER_SOFTWARE".
Кто-то скажет, - "и это все?". Нет! На этом чудеса SSI еще не заканчиваются.
Приведу еще несколько любопытных и полезных команд.
Email. В простейшем варианте позволяет отправить заранее составленное сообщение на заранее определенный адрес.
Пример: <!--#email tohost="xakep.ru" message="You made the coolest magazine, that people ever made!" toaddress="test@xakep.ru" subject="SSI is coolest tool in the world, ya-ba-da-ba-doo!"-->.
Параметров у этой команды, конечно, больше, чем приведенные здесь. Здесь указаны только 4 необходимых (обязательных) команды: tohost - на какой хост (почтовый сервер) отправить письмо, message - текст самого послания, toaddress - почтовый адрес, на какой слать письмо, и последнее - subject, легко догадаться - тема письма.
Понятно, что при таком синтаксисе команды письмо будет отправляться каждый раз при заходе посетителя на страницу с этой командой.
Точно таким же образом можно использовать эту команду в ответе на заполнение формы (форму можно отправлять на анонимный адрес, а письмо с уведомлением на более реальный.
Fsize. Команда выводит в текущий документ размера указанного файла.
Пример: <!--#fsize virtual="../log-file.txt"-->.
Может быть полезна для удаленного контроля размера лога или еще для каких целей.
Flastmod. Эта команда позволяет включить в документ дату последней модификации любого доступного файла.
Пример: <!--#flastmod virtual="mysuperfile.htm"-->.
В отличие от echo-команды, команда Flastmod скажет "всю правду" о любом интересующем файле!
Очень хороший способ для начальников контролировать их нерадивых подчиненных (шучу). Но на самом деле очень удобно - делаешь себе одну страничку, где идет список всех файлов, и после обновлений на сайте смотришь - не перепутал ли чего. Оно ведь всяко может быть.
Break. Как легко понять из имени команды, она занимается прерыванием. Эта команда, как только она встречается, немедленно и безусловно останавливает дальнейший вывод документа.
Пример: <!--#break -->.
Чрезвычайно проста в использовании и не менее чрезвычайно полезна при отладке важных страниц. Я думаю, ни у кого не возникает сомнений, что страницу на гипертексте тоже можно (и нужно!) отлаживать.
Безусловно, это не все тэги, доступные в синтаксисе SSI. К примеру, за скобками остались такие команды, как exec (позволяет выполнять внешние программы и cgi-скрипты), или сonfig (изменяет вывод таких, к примеру, команд, как fsize, flastmod, позволяя настроить нужный формат выдачи сообщений.
Немного программирования
Конечно, в SSI кое-что есть от программирования. Но все же большинство команд - статичны. Тем не менее, для тех, кто хочет делать по-настоящему динамически изменяемые страницы, придутся по душе несколько "чисто программистских" операторов, содержащихся в SSI.
Из всех операторов программирования самым важным для нас, безусловно, является оператор IF. В SSI тег IF позволяет осуществлять вывод определенного текста в зависимости от условий.
В общем виде синтаксис команды выглядит так:
if' "<operand1>" <operator> "<operand2>" <operation>.
На месте последней команды "operation" может быть один из операторов: 'goto', 'print', 'error', 'break', 'errorbreak' или 'printbreak'.
Очень простой пример - допустим, нужно показывать что-то использующим определенный браузер и не показывать это остальным - не хрена им не в свое дело лезть.
Пишем:
<!--#if "&&HTTP_USER_AGENT&&" hasstring "Mozilla" goto Mozilllalabel-->
<P>Ты, пацан попал, у тебя неправильный браузер, и здесь ты ничего не увидишь
<!--#goto ="defaultlabel" -->
<!--#label ="Mozilllabel" -->
<P>А ты пацан клевый, и мне очень нравится твой браузер .
<!--#label ="defaultlabel" -->
(Здесь уже можно ничего не писать).
Все просто, просто до безобразия.
Можно использовать IF для того, чтобы сравнивать текст в формах. Т.е. можно проверить идентичность заполнения форм (а вдруг человек ошибся) или напоминать гостю, что какую-то позицию формы он не заполнил. Вежливо и элементарно.
В примере выше я использовал два стандартных оператора - goto и label. Надо "осветить" их чуть более подробно.
Goto. Используется в связке с меткой label (см. ниже).
Синтаксис команды: <!--#goto ="<label>"-->
Пример. <!--#goto ="secretlabel" -->
<P>Это увидят только те, кому положено видеть
<!--#label ="secretlabel" -->
<P>А этот текст увидят все, без разбора.
Важное замечание: между символами