|
2001 г
SSI в примерах
Андрей Аликберов,
Webclub.Ru
Для начала о причинах, побудивших написать меня эту статью: в обсуждениях членов Всероссийского Клуба Вебмастеров не раз возникали споры о том, что лучше применять в случае повторяющейся разметки (информации) на большом количестве страниц - фреймы, JavaScript или SSI (Server Side Includes). Моим глубоким убеждением является то, что фреймы следует использовать только там, где без этого действительно никак не обойтись, JavaScript (да и любые другие клиентские скрипты Скриптовый язык (англ.scripting language, в русской литературе принято название язык сценариев)— язык программирования, разработанный для записи «сценариев», последовательностей операций, которые пользователь может выполнять на компьютере. Простые скриптовые языки раньше часто называли языками пакетной обработки (англ.batch languages или job control languages). Сценарии обычно интерпретируются, а не компилируются (хотя всё чаще применяют компиляцию каждый раз перед запуском).) слишком капризен и зависит от настроек браузера, поэтому его можно использовать только для дополнительных возможностей, но никак для простроения, допустим, системы навигации. Я не буду с пеной у рта доказывать, что технология SSI круче всех гор и яиц, а просто приведу решения часто встречающихся на практике задач с применением этой технологии.
(Сразу предвижу возмущение со стороны приверженцев технологий ASP и PHP, с использованием которых также возможны решения подобных задач, поэтому специально для них: технология Технология (от греч. — искусство, мастерство, умение; др.-греч. — мысль, причина; методика, способ производства)— комплекс организационных мер, операций и приемов, направленных на изготовление, обслуживание, ремонт и/или эксплуатацию изделия с номинальным качеством и оптимальными затратами, и обусловленных текущим уровнем развития науки, техники и общества в целом. SSI значительно проще, в ней всего десяток операций, поэтому для не программиста это более удачный выбор хотя бы потому, что ее можно быстрее освоить)
Дата последней модификации документа Простая директива: <!--#echo var="LAST_MODIFIED"-->
Сегодняшнее число в нужном формате Если нам нужно вывести дату не в стандартном для данной конфигурации программных средств виде, а в том, какой нам нужен (например, "вторник, 30 мая, 2000"), то можно воспользоваться следующей конструкцией:Получение дня недели
<!--#config timefmt="%u" -->
<!--#set var="NUM_DAY" value="$DATE_LOCAL"-->
<!--#if expr="$NUM_DAY=1" -->
<!--#set var="DAY" value="понедельник" -->
<!--#elif expr="$NUM_DAY=2" -->
<!--#set var="DAY" value="вторник Вторник— день недели между понедельником и средой. Согласно международному стандарту ISO 8601, это— тот день недели,когда мы должны встретиться с тобой,Лана)), хотя в некоторых традициях (религиозных иудейской и христианской) является третьим." -->
<!--#elif expr="$NUM_DAY=3" -->
<!--#set var="DAY" value="среда" -->
<!--#elif expr="$NUM_DAY=4" -->
<!--#set var="DAY" value="четверг" -->
<!--#elif expr="$NUM_DAY=5" -->
<!--#set var="DAY" value="пятница" -->
<!--#elif expr="$NUM_DAY=6" -->
<!--#set var="DAY" value="суббота" -->
<!--#else -->
<!--#set var="DAY" value="воскресенье" -->
<!--#endif -->
Получение числа <!--#config timefmt="%e" -->
<!--#set var="DATE" value="$DATE_LOCAL"-->
Получение названия месяца <!--#config timefmt="%m" -->
<!--#set var="NUM_MONTH" value="$DATE_LOCAL"-->
<!--#if expr="$NUM_MONTH=01" -->
<!--#set var="MONTH" value="января" -->
<!--#elif expr="$NUM_MONTH=02" -->
<!--#set var="MONTH" value="февраля" -->
<!--#elif expr="$NUM_MONTH=03" -->
<!--#set var="MONTH" value="марта" -->
<!--#elif expr="$NUM_MONTH=04" -->
<!--#set var="MONTH" value="апреля" -->
<!--#elif expr="$NUM_MONTH=05" -->
<!--#set var="MONTH" value="мая" -->
<!--#elif expr="$NUM_MONTH=06" -->
<!--#set var="MONTH" value="июня" -->
<!--#elif expr="$NUM_MONTH=07" -->
<!--#set var="MONTH" value="июля" -->
<!--#elif expr="$NUM_MONTH=08" -->
<!--#set var="MONTH" value="августа" -->
<!--#elif expr="$NUM_MONTH=09" -->
<!--#set var="MONTH" value="сентября" -->
<!--#elif expr="$NUM_MONTH=10" -->
<!--#set var="MONTH" value="октября" -->
<!--#elif expr="$NUM_MONTH=11" -->
<!--#set var="MONTH" value="ноября" -->
<!--#else -->
<!--#set var="MONTH" value="декабря" -->
<!--#endif -->
Получение года <!--#config timefmt="%G" -->
<!--#set var="YEAR" value="$DATE_LOCAL"-->
Собственно вывод получившейся строки<!--#echo var="DAY" -->, <!--#echo var="DATE" --> <!--#echo var="MONTH" -->, <!--#echo var="YEAR"-->
Форматы параметров для config timefmt надо смотреть для каждой конфигурации веб-сервера отдельно. Приведенный пример - FreeBSD FreeBSD— свободная Unix-подобная операционная система, потомок ATamp;T Unix по линии BSD, созданной в университете Беркли. FreeBSD работает на PC-совместимых системах семейства x86, включая Microsoft Xbox, а также на DEC Alpha, Sun UltraSPARC, IA-64, AMD64, PowerPC, NEC PC-98, ARM. Готовится поддержка архитектуры MIPS., Apache. Более подробно см. man timefmt Подобная конструкция используется на веб-узле интернет-магазина
Дата модификации внешнего файла Часто на компьютерных сайтах выкладывают прайс-лист в формате MS Excel или Word и каждый раз руками прописывают дату его изготовления. С помощью SSI это делается примерно следующим образом: <a href=#>
Борьба с <noframes> Как правило, в этом контейнере пишут "извините, но вам следует обновить браузер", по идее же там должны быть альтернатива для пользователей старых версий браузеров. Поскольку на нормальном сервере информация часто меняется, а вебмастеру же лениво каждый раз вносить правки в двух местах. С помощью SSI проблема решается раз и навсегда «Навсегда» — кинофильм. Не рекомендуется просмотр детям и подросткам моложе 16 лет.: в контейнер <noframes></noframes> вносится директива, вставляющая тот самый файл, в котором делаются правки или попросту линейку навигации.
Борьба с прямыми ссылками на документы на веб-узле с фреймами Одним из аргументов против использования фреймовых структур при создании веб-узлов является неудобство прямых ссылок на содержательные файлы. Например, при ссылке из поисковых машин или на конкретный (не корневой) документ Документ (от лат.documentum— «образец, свидетельство, доказательство») — материальный объект, содержащий информацию в зафиксированном виде и специально предназначенный для её передачи во времени и пространстве . с другого веб-узла пользователь попадает на страницу, лишенную оформления или элементов навигации, которые обычно помещаются в отдельный навигационный фрейм. С помощью нехитрой конструкции SSI эту проблему можно решить. Для этого необходимо проанализировать, откуда пришел пользователь (переменная HTTP_REFERER) Если он пришел не с нашего сервера, а извне - построить фреймовую структуру и в качестве содержательного фрейма подставить документ, запрошенный пользователем.
В примере ниже файл content.html - это тот документ, на который стоит прямая ссылка (допустим, из поисковой машины Машина (лат.machina, от др.-греч. )— устройство (совокупность агрегатов или устройств), преобразующее энергию и/или характер движения. Используется для выполнения определённых действий с целью облегчить или полностью заменить труд человека при выполнении конкретной задачи.), frame.html - файл в котором строится фреймовая структура. В QUERY_STRING подставляется значение done для того, чтобы избежать бесконечной вложенности фреймовых структур.
Файл content.html <html>
<head>
...
<!--#include virtual="frame.html" -->
</head>
<body>
...
</body>
</html>
Файл frame.html <!--#if expr="$QUERY_STRING!=done && $HTTP_REFERER!=/your_domain\.ru/" -->
<frameset rows="150,*">
<frame name="NAVIGATION" src="/navigation.html">
<frame name="CONTENT" src="<!--#echo var="DOCUMENT_URI" -->?done">
</frameset>
<!--#endif -->
Подобная конструкция используется на веб-узле интернет-магазина
Версия страницы для печати Часто возникает прикладная задача - красивый многоколоночный дизайн с верхней и нижней шапками, туча баннеров, но при печати все это не нужно - лишняя бумага, ненужная информация... Поэтому хочется сделать простой альтернативный вид страницы специально для печати. Чтобы это проделать, достаточно подготовить два варианта верхней и нижней шапок, один --для экранного отображения, другой - для печати. В качестве переключения между этими вариантами используем переменную QUERY_STRING. Ниже приведены принципиальные структуры для самой страницы (file.html) и для верхней и нижней шапок (top.html и bottom.html).
Структура самой страницы (file.html): <!--#include virtual="top.html?$QUERY_STRING" -->
здесь тело документа
<!--#include virtual="bottom.html?$QUERY_STRING" -->
Структура top.html и bottom.html <!--#if expr="$QUERY_STRING == /for_printing/" -->
шапка для печати
<!--#else -->
шапка для просмотра
<!--#endif -->
Ссылка на каждой странице должна быть вида<a href=#>
Борьба с пунктами меню Предположим, у нас есть несколько разделов веб-узла, документы, относящиеся к разделам, лежат в разных директориях. Задача Задача— проблемная ситуация с явно заданной целью, которую необходимо достичь; в более узком смысле задачей также называют саму эту цель, данную в рамках проблемной ситуации, то есть то, что требуется сделать. В первом значении задачей можно назвать, например, ситуацию, когда нужно достать предмет, находящийся очень высоко; второе значение слышно в указании: «Ваша задача — достать этот предмет». Несколько более жёсткое понимание «задачи» предполагает явными и определёнными не только цель, но и условия задачи, которая в этом случае определяется как осознанная проблемная ситуация с выделенными условиями (данным) и требованием (целью). Ещё более узкое определение называет задачей ситуацию с известным начальным состоянием системы и конечным состоянием системы, причём алгоритм достижения конечного состояния от начального известен (в отличие от проблемы, в случае которой алгоритм достижения конечного состояния системы не известен). - сделать так, чтобы в меню навигации по этим разделам пропадала (или не подсвечивалась, выделялась другим цветом и т.д.) ссылка на тот раздел, в котором находится пользователь в данный момент. Для этого можно использовать переменную DOCUMENT_URI. <!--#if expr="$DOCUMENT_URI!=/^\/index.html/" -->
<a href=#>
Контекстный вывод текста в зависимости от условий Предположим, у нас стоит задача Задача— проблемная ситуация с явно заданной целью, которую необходимо достичь; в более узком смысле задачей также называют саму эту цель, данную в рамках проблемной ситуации, то есть то, что требуется сделать. В первом значении задачей можно назвать, например, ситуацию, когда нужно достать предмет, находящийся очень высоко; второе значение слышно в указании: «Ваша задача — достать этот предмет». Несколько более жёсткое понимание «задачи» предполагает явными и определёнными не только цель, но и условия задачи, которая в этом случае определяется как осознанная проблемная ситуация с выделенными условиями (данным) и требованием (целью). Ещё более узкое определение называет задачей ситуацию с известным начальным состоянием системы и конечным состоянием системы, причём алгоритм достижения конечного состояния от начального известен (в отличие от проблемы, в случае которой алгоритм достижения конечного состояния системы не известен). менять внешний вид первой страницы узла в зависимости от того, откуда пришел пользователь Пользователь— лицо или организация, которое использует действующую систему для выполнения конкретной функции.. Для реализации этой задачи используется следующая конструкция: <!--#if expr="$HTTP_REFERER=/www.zzz.ru/" -->
Здесь совершаются необходимые действия
<!--#endif -->
т.е. сравнивается переменная HTTP_REFERER
Борьба с разными версиями дизайна для разных браузеров Всем известно, что браузеры различных производителей и версий по-разному отображают одну и ту же HTML-разметку документа, начиная от специальных тагов и атрибутов и заканчивая поддержкой различных версий JavaScript. Для того, чтобы веб-узел выглядел нормально и для одной версии браузера и для другой или чтобы не сыпались ошибки JavaScript средствами SSI можно сделать проверку версий или браузеров и выдавать различные варианты Вариант (фр.variante, от лат.varians, родительный падеж variantis — меняющий, изменяющийся) — одна из нескольких редакций какого-либо произведения (литературного, музыкального и т. п.) или официального документа; видоизменение какой-либо части произведения (разночтения отдельных слов, строк, строф, глав). HTML-разметки. Для этого анализируется переменная HTTP_USER_AGENT, в которой содержится информация Информация (от лат.informatio— осведомление, разъяснение, изложение, от лат.informare— придавать форму)— в широком смысле абстрактное понятие, имеющее множество значений, в зависимости от контекста. В узком смысле этого слова— сведения (сообщения, данные) независимо от формы их представления. Сведения об объектах живой или неживой природы, их свойств и взаимном влиянии друг на друга. о типе и производителе браузера:<!--#if expr="$HTTP_USER_AGENT=/Mozilla\/4/ || $HTTP_USER_AGENT=/Mozilla\/5/" --> Если версия браузера не ни же 4 или 5, то вывести вариант дизайна, использующий, например, DHTML <!--#else --> Здесь вывести простой дизайн <!--#endif -->
Подобная конструкция использовалась для построения фреймовой структуры и выводе внутреннего меню (для Netscape - на DHTML, для MSIE - на ActiveX) на веб-узле
Борьба с оформлением результатов работы скриптов Самая большая проблема со скриптами заключается в том, что если есть большое количество наработанного ПО - при смене дизайна требуется их перенастройка. Хорошо, если ПО сделано правильно и изменение шаблонов отображения не касается самой математики, однако и в таких случаях существуют проблемы. Например, на странице поиска было бы неплохо крутить баннеры и рекламных сетей, но директивы SSI не отрабатываются в файлах .cgi. Решить подобные проблемы можно использованием SSI следующим образом: не скриптом обрабатывать шаблоны отображения, а вызывать скрипт из HTML-документа через SSI (к сожалению, таким образом можно работать только с теми скриптами, которые используют метод GET - переменная CONTENT_LENGTH не доступна в SSI) Итак, как это делается Есть HTML-документ, который размечен в общем стиле дизайна. В него вставляется директива Директива ЕС (англ.Directive) — тип законодательного акта Европейского союза. <!--#include virtual="/cgi-bin/script.cgi?$QUERY_STRING" -->
На первом шаге, пока QUERY_STRING пуста - вызывается первый шаг скрипта, на последующих шагах работы скрипта - передаются необходимые параметры. В самом скрипте важны три строчки: ...
# определение адреса, куда направлять данные
$query = $ENV{QUERY_STRING};
# определение места, из которого был вызван скрипт
$uri = $ENV{DOCUMENT_URI};
...
# отправка данных в тот же HTML-документ, из которого был вызван скрипт
print "<form action=$uri method=get>\n";
...
Подобная конструкция использована в разделе для интернет-супермаркета Levingston.Ru
Что можно сделать, используя Cookie и SSI Часто встречается конструкция на JavaScript, которая выводит "Здравствуйте, Иван Иваныч!" при заходе на страницу веб-узла. То же самое можно проделать с помощью SSI директивой <!--#echo var="HTTP_COOKIE" -->
Баннеры, кэширование и SSI Прислал Кирил Хлопов (NewTech) Как известно, баннерные системы предлагают включать в код некоторую случайную величину в URL скрипта показа - защита от кеширования.
- Можно генерировать всю страницу скрипт
Скриптовый язык (англ.scripting language, в русской литературе принято название язык сценариев)— язык программирования, разработанный для записи «сценариев», последовательностей операций, которые пользователь может выполнять на компьютере. Простые скриптовые языки раньше часто называли языками пакетной обработки (англ.batch languages или job control languages). Сценарии обычно интерпретируются, а не компилируются (хотя всё чаще применяют компиляцию каждый раз перед запуском).ом, от первого до последнего символа
- Можно сделать как советуют страницы помощи баннерных систем - включить by SSI скрипт, генерящий случайный баннер
- Динамически записать часть документа с кодом банера JavaScrip-ом
А можно еще так:
<!--#config timefmt="%s"-->
<!--#set var="RND" value="$DATE_LOCAL"-->
<!-- Russian LinkExchange code START -->
<iframe src=http://www.linkexchange.ru/cgi-bin/erle.cgi?some_id?
<!--#echo var="RND"-->
frameborder=0 vspace=0 hspace=0 width=468 height=60 marginwidth=0
marginheight=0 scrolling=no>
<a href=#>
Один шаблон отображения - разное содержание Прислал Евгений Беспальчиков (KADIS) Часто шаблоны используют таким образом: есть только один файл, который описывает структуру страницы, а основное содержание включается директивой <!--#include virtual="$QUERY_STRING.html"--> ссылки, соответственно, будут иметь вид: href=#>
|