Глаза страшат, а руки делают

ДИРЕКТИВЫ


Директивы по алфавиту вместе с атрибутами. Одни и те же атрибуты могут использоваться с разными директивами. Поиск по атрибутам — на странице «Атрибуты».

ПРИМЕЧАНИЕ

Здесь не затронуты директивы, относящиеся к спецификации SSI+.

#break

Останавливает вывод документа.

Атрибутов нет

ПРИМЕР

<p>Эта строка будет напечатана.</p>
<!--#break -->
<p>Эта строка не будет напечатана, потому что документ обрезан и связь с клиентом прервана.</p>

ПРИМЕЧАНИЕ

Работает не на всех серверах.

#config

Управляет следующимими опциями SSI: установка текста сообщения об ошибке, настройка формата вывода размера файла и даты/времени. Сама директива ничего не выводит, лишь даёт указания, которые используют другие директивы.

Атрибуты: errmsg, sizefmt, timefmt, cmdecho, cmdprefix, cmdpostfix

errmsg — устанавливает любой текст сообщения об ошибке вместо стандартного [an error occurred while processing this directive].

ПРИМЕЧАНИЕ

Инструкция #config errmsg должна быть помещена на основной странице документа. Находясь во вложенной странице, она не срабатывает. Так что задать её один раз на весь сайт не получится.

ПРИМЕР (из Чехова)

<!--#config errmsg = "[Подъезжая к своей станцыи, у меня слетела шляпа]" -->

Результат (задана заведомо не существующая директива)

[Подъезжая к своей станцыи, у меня слетела шляпа]

 

sizefmt — определяет формат вывода размера файла:

<!--#config sizefmt = "bytes" --> — в байтах;

<!--#config sizefmt = "abbrev" --> — в килобайтах.

 

ПРИМЕЧАНИЕ

Русскому человеку может показаться, что bytes тоже задаёт размер в килобайтах, только с меньшим округлением. Я тоже на это попался (минут 20 гуглил справочники, пока не дошло до идиота). Вспомним, что «у них там» десятичным разделителем служит точка, а запятая (которая выводится при использовании bytes) поразрядно разделяет тысячи.

timefmt — определяет формат вывода даты и времени. Для этого существует ряд шаблонов (красным помечены шаблоны, зависимые от настроек сервера или ОС, в [квадратных скобках] — неописанные шаблоны, найденные мною эмпирически).

ПРИМЕЧАНИЕ

Большинство серверов работают под UNIX. Но встречаются и под Windows. Мой сайт находится на нормальном UNIX’овом сервере, а для предварительных прогонов и тестов я пользуюсь виртуальным сервером, установленным на моём компьютере под Windows.

Формат

Описание

Результат

Примечания

%a

Краткое название дня недели

Sun

 

%A

Полное название дня недели

Sunday

 

%b

Аббревиатура названия месяца

Mar

В трёхбуквенном мае полное и краткое назваеия совпадают.

%B

Полное название месяца

March

%c

формат даты и времени по умолчанию ("%x %X")

Sun Mar 26 20:38:43 2017

На сервере данного сайта выводится как "%a %b %d %X %Y"

[%C]

[?]

20

Нашёл методом тыка,
значения пока не понял.

%d

День месяца

26

от 01 до 31
(с предваряющим нулём)

%D

Дата в формате "%m/%d/%y"

03/26/17

 

%e

День месяца

26

от 1 до 31
(без предваряющего нуля)

[%E]

[Вывод символа E]

E

Под Windows — пусто.

[%f]

[Вывод символа f]

f

Под Windows — пусто.

[%F]

[Дата в формате
%Y-%m-%d]

2017-03-26

Под Windows — пусто.

[%g]

[Год в формате ГГ]

17

Под Windows — пусто.

[%G]

[Год в формате ГГГГ]

2017

Под Windows — пусто.

[%h]

[Аббревиатура названия месяца]

Mar

Под Unix — то же, что и %b;
под Windows — пусто.

%H

Часы в 24-часовом формате

20

С некоторых пор на моём сервере время по умолчанию почему-то установили в GMT (по Гринвичу). Так что нормальное российское время через мои SSI установить, увы, невозможно.

[%i]

[Вывод символа i]

i

Под Windows — пусто.

%I

Часы в 12-часовом формате

08

 

%j

День года

085

Под Unix нумерация с 1,
под Windows — с 0.

[%J]

[Вывод символа J]

J

Под Windows — пусто.

[%k]

[Часы в 24-часовом формате (то же, что и %H)]

20

Под Windows — пусто.

[%K]

[Вывод символа K]

K

Под Windows — пусто.

[%l]

[[Часы в 12-часовом формате (то же, что и %I)]

8

Под Windows — пусто.

[%L]

[Вывод символа L]

L

Под Windows — пусто.

%m

Номер месяца

03

 

%M

Минуты

38

 

%n

Вставка символа новой строки

 

[%N]

[Вывод символа N]

N

Под Windows — пусто.

[%o]

[Вывод символа o]

o

Под Windows — пусто.

[%O]

[Вывод символа O]

O

Под Windows — пусто.

%p

AM/PM (до полудня/после)

PM

 

[%P]

[Вывод символа P]

P

Под Windows — пусто.

[%q]

[Вывод символа q]

q

Под Windows — пусто.

[%Q]

[Вывод символа Q]

Q

Под Windows — пусто.

%r

Время в формате "%I:%M:%S %p"

08:38:43 PM

 

%R

Время в формате "%H:%M"

20:38

 

%s

Время в секундах с 01.01.1970

1490560723

Под Windows — пусто.

%S

Секунды

43

 

%t

Вставка символа табуляции

 

%T

Время в формате "%H:%M:%S"

20:38:43

 

[%u]

[Номер дня недели]

7

С понедельника по воскресенье, 1–7
(номера с понедельника по субботу совпадают с %w)
Под Windows — пусто.

%U

Неделя года (первый день недели — воскресенье)

13

 

[%v]

[Дата в формате "%e-%b-%Y"]

26-Mar-2017

Под Windows — пусто.

[%V]

[?]

12

Нашёл методом тыка,
значения пока не понял.

%w

Номер дня недели

0

С воскресенья по субботу, 0–6
(номера с понедельника по субботу совпадают с %u)

%W

Неделя года (первый день недели — понедельник)

12

 

%x

формат даты по умолчанию

03/26/17

 

%X

формат времени по умолчанию

20:38:43

 

%y

Год в формате ГГ

17

 

%Y

Год в формате ГГГГ

2017

 

[%z]

[Временная зона (поправка к GMT)]

+0000

Нашёл методом тыка.

Извините за нули, но «шляпа слетела» не у меня, а у сервера

%Z

Временная зона (название)

UTC

Под Windows этот и предыдущий
шаблон показывают одинаковое значение в формате
"Московское время (зима)"

%%

Ввод символа %

%

 

Можно комбинировать шаблоны друг с другом и с любыми прочими символами.

ПРИМЕР

<!--#config timefmt = "%d.%m.%Y, %H:%M" -->
<p>Последнее обновление страницы: <!--#flastmod file = "ssi2_1.html" --></p>

Формат вывода:

Последнее обновление страницы: 26.09.2014, 11:06

cmdecho — определяет выходные параметры команды, выполненной директивой #exec cmd.

ОПИСЫВАЮ ЧИСТО ТЕОРЕТИЧЕСКИ. НА ПРАКТИКЕ ПОКА ЧТО [...СЛЕТЕЛА ШЛЯПА]

Формат:

<!--#config cmdecho = "onoroff" -->

onoroff — ON или OFF. Если команда директивы #exec cmd возвращает данные, которые можно вывести через #echo, они выводятся при значении ON и игнорируются при значении OFF.

По умолчанию — OFF.

Формат выводимых данных зависит от наличия или отсутствия директив #config cmdprefix и #config cmdpostfix.

При отсутствии этих директив данные выводятся без форматирования и интерпретации специальных символов. При их наличии вывод будет отформатирован и интерпретирован в соответствии с их значениями.

cmdprefix — используется для установки текста, начинающего каждую строку, выводимую каждой следующей инструкцией #exec cmd.

ОПИСЫВАЮ ЧИСТО ТЕОРЕТИЧЕСКИ. НА ПРАКТИКЕ ПОКА ЧТО [...СЛЕТЕЛА ШЛЯПА]

Формат:

<!--#config cmdprefix = "строка" -->

строка — любой символ и/или тэг HTML.

cmdpostfix — используется для установки текста, завершающего каждую строку, выводимую каждой следующей инструкцией #exec cmd.

ОПИСЫВАЮ ЧИСТО ТЕОРЕТИЧЕСКИ. НА ПРАКТИКЕ ПОКА ЧТО [...СЛЕТЕЛА ШЛЯПА]

Формат:

<!--#config cmdpostfix = "строка" -->

строка — любой символ и/или тэг HTML.

#echo

Выводит значеня переменных или даты, отформатированной в инструкции #config timefmt.

Атрибуты: encoding, var

encoding — необязательный атрибут, определяет интерпретацию текста браузером. Имеет 3 значения: entity (по умолчанию), url и none.

  • entity — по умолчанию. В этом случае происходит замена символов языка HTML на спецсимволы для вывода их на страницу;
  • url — произодится так называемое escape-преобразование, т.е. все символы приобретут вид %nn (nn — код символа в 16-ричной кодировке), что позволит их применять в строке URL;
  • none — не будет никаких преобразований, т.е. тэги HTML, которые раньше заменялись на спецсимволы, теперь заменяться не будут, и в переменные SSI можно вставлять код HTML. А вот спецсимволы будут заменяться на тэги.

ПРИМЕЧАНИЕ

Атрибут encoding всегда ставится перед атрибутом var.

ПРИМЕР

<!--#set var = "string1" value = "Тестируем <b>тэги</b> <i>HTML</i>" -->
<p>По умолчанию:<br><!--#echo var = "string1" --></p>
<p>Значение none:<br><!--#echo encoding = "none" var = "string1" --></p>
<p>Значение url:<br><!--#echo encoding = "url" var = "string1" --></p>

Результат

По умолчанию:
Тестируем <b>тэги</b> <i>HTML</i>

Значение none:
Тестируем тэги HTML

Значение url:
%d2%e5%f1%f2%e8%f0%f3%e5%ec%20%3cb%3e%f2%fd%e3%e8%3c/b%3e%20%3ci%3eHTML%3c/i%3e


var — определяет имя переменной, значение которой надо вывести.

ПРИМЕРЫ

Вывод текущего времени в формате «чч:мм:сс»

<!--#config timefmt = "%T" -->
<p>Текущее время: <!--#echo var = "DATE_LOCAL" --></p>

Результат

Текущее время: 20:38:43

Вывод значения переменной окружения HTTP_USER_AGENT

<p><!--#echo var = "HTTP_USER_AGENT" --></p>

Результат

CCBot/2.0 (http://commoncrawl.org/faq/)

#exec

Запускает внешние программы и скрипты CGI.

Атрибуты: cmd, cgi

cmd — задаёт параметры для выполнения программ, выполняемых UNIX shell.

ОПИСЫВАЮ ЧИСТО ТЕОРЕТИЧЕСКИ. НА ПРАКТИКЕ ПОКА ЧТО [...СЛЕТЕЛА ШЛЯПА]

Формат:

<!--#exec cmd = "имя_программы список_аргументов" -->

имя_программы — полное имя исполняемой программы или команды;

список_аргументов — список аргументов, посылаемых исполняемой программе.

ПРИМЕЧАНИЕ

На сервере должны быть заданы пути к исполняемой программе в переменной окружения PATH.

При отсутвии пути программу можно запустить, используя shell или скрипт CGI.

Стандартный вывод программы направляется в документ HTML. Вывод может быть модифицирован директивой #config cmdecho.

ПРИМЕЧАНИЕ

Под Win32 и под UNIX с использованием suExec в директиве #exec cmd нельзя передавать аргументы команды или иным образом включать пробелы в значении cmd. Следующий пример будет работать только под UNIX конфигурации non-suExec, но не сработает ни под Win32, ни при выполнении suExec:

<!--#exec cmd="perl /cgi-bin/counter/counter.pl page4" -->

Вместо этого следует применить другую директиву:

<!--#include virtual="/cgi-bin/counter/counter.pl?page4" -->

В любом случае: если можно обойтись директивой #include, то лучше применять её вместо #exec.

cgi — вызывает скрипт CGI. Вызываемый скрипт должен находится в директории cgi-bin или иметь расширение .cgi. Формат:

<!--#exec cgi = "имя_скрипта" -->

имя_скрипта — полное имя скрипта CGI.

Вывод скрипта подставляется в документ.

#flastmod

Отображает дату последнго обновления указанного файла (формат даты можно установить директивой config).

Атрибуты: file, virtual

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

virtual — задает виртуальный путь к документу на сервере. Начинается со слэша.

/file.html — находится в корневой папке.

/subdir/file.html — находится в папке subdir, вложенной в корневую.

ПРИМЕР

<!--#config timefmt = "%d.%m.%Y, %H:%M" -->
<p>Последнее обновление страницы: <!--#flastmod file = "ssi2_1.html" --></p>

Результат

Последнее обновление страницы: 26.09.2014, 11:06

#fsize

Отображает размер определённого файла (формат вывода размера файла можно определить директивой #config).

Атрибуты: file, virtual

file — указывает путь к файлу относительно текущего документа.

virtual — задает виртуальный путь к документу на сервере.

(Подробнее об этих атрибутах см. #flastmod).

ПРИМЕРЫ

Определяем размер данного файла в байтах (через атрибут file).

ПРИМЕЧАНИЕ

Не путайте «импортные» точки и запятые.

<!--#config sizefmt = "bytes" -->
<p><!--#fsize file = "ssi2_1.html" --></p>

Результат

45,076

Определяем размер главной страницы «Мастерской Самоделкина» в байтах (через атрибут file).

<!--#config sizefmt = "bytes" -->
<p><!--#fsize fil e ="index.html" --></p>

Результат

5,134

Определяем размер главной страницы сайта в килобайтах (через атрибут virtual).

<!--#config sizefmt = "abbrev" -->
<p><!--#fsize virtual = "/index.html" --></p>

Результат

8k

Определяем размер главной страницы «Мастерской Самоделкина» в килобайтах (через атрибут virtual).

<!--#config sizefmt = "abbrev" -->
<p><!--#fsize virtual = "/samodel/index.html" --></p>

Результат

5k

#goto

Оператор перехода на метку.

Атрибутов нет, вместо атрибута используется значение

метка — имя метки, определяемое директивой #label.

ПРИМЕР

<!--#goto = "testlabel" -->
<p>Эта строка не выводится.</p>
<!--#label = "testlabel" -->
<p>Эта строка выводится.</p>

ПРИМЕЧАНИЕ

Работает не на всех серверах.

#include

Директива include — одна из наиболее используемых. У некоторых этой директивой ограничивается всё представление об SSI.

Вставляет содержимое другого файла в текущий документ. К файлу обязательно должен быть открыт доступ, иначе он не будет показан.

Можно включать файлы с расширением .txt, .htm, .html, .shtml. Для основного файла — «приёмника» включений — предусмотрено специальное расширение .shtml, но это не обязательно и зависит от настроек сервера, которыми можно управлять в файле .htaccess (см. «Настройка сервера»).

Атрибуты: file, virtual

file — указывает путь к файлу относительно текущего документа.

virtual — задает виртуальный путь к документу на сервере.

(Подробнее об этих атрибутах см. #fsize).

ПРИМЕР

<!--#include file = "top1.html" -->

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

#label

Устанавливает метку в документе, которая используется директивой #goto.

Атрибутов нет, вместо атрибута используется значение

ПРИМЕР

<!--#goto = "testlabel" -->
<p>Эта строка не выводится.</p>
<!--#label = "testlabel" -->
<p>Эта строка выводится.</p>

ПРИМЕЧАНИЕ

Работает не на всех серверах.

#printenv

Выводит имена и значения всех переменных окружения, определённых на данном сервере.

Атрибутов нет

ПРИМЕР

Выводим список всех переменных окружения

ПРИМЕЧАНИЕ

Чтобы было «читабельнее», лучше это сделать в тэге <pre>, а чтобы при этом не порушить дизайн, назначить ему в CSS приемлемую ширину и задать прокрутку. Поскольку список очень длинный, имеет смысл ограничить и высоту контейнера (с соответствующей прокруткой).

<pre style="width: 610px; height: 300px; overflow: scroll;">
<!--#printenv -->
</pre>

Результат

DOCUMENT_ROOT=/www/frolan01/www/htdocs/
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_ACCEPT_ENCODING=x-gzip, gzip, deflate
HTTP_CONNECTION=close
HTTP_HOST=froland.ru
HTTP_SERVER_ADDR=89.111.177.202
HTTP_USER_AGENT=CCBot/2.0 (http://commoncrawl.org/faq/)
HTTP_X_REAL_IP=54.167.135.61
PATH=/sbin:/bin:/usr/sbin:/usr/bin
REMOTE_ADDR=54.167.135.61
REMOTE_PORT=49829
SCRIPT_FILENAME=/www/frolan01/www/htdocs/samodel/ssi2_1.html
SCRIPT_URI=http://froland.ru/samodel/ssi2_1.html
SCRIPT_URL=/samodel/ssi2_1.html
SERVER_ADDR=127.0.0.1
SERVER_ADMIN=support@hc.ru
SERVER_NAME=froland.ru
SERVER_PORT=80
SERVER_SIGNATURE=<ADDRESS>Apache/1.3.42 Server at froland.ru Port 80</ADDRESS>

SERVER_SOFTWARE=Apache/1.3.42 (Unix)
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.0
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/samodel/ssi2_1.html
SCRIPT_NAME=/samodel/ssi2_1.html
DATE_LOCAL=26.03.2017, 20:38
DATE_GMT=26.03.2017, 20:38
LAST_MODIFIED=26.09.2014, 11:06
DOCUMENT_URI=/samodel/ssi2_1.html
DOCUMENT_PATH_INFO=
USER_NAME=frolan01
DOCUMENT_NAME=ssi2_1.html
TIME_FMT=%
string1=Тестируем <b>тэги</b> <i>HTML</i>

Кроме вывода этого огромного списка, директива #printenv ничего делать не умеет.

Чтобы вывести значения отдельных переменных окружения, нужно использовать #echo var.

Выведем разные варианты адреса этой страницы

<p><!--#echo var = "SCRIPT_FILENAME" --></p>
<p><!--#echo var = "SCRIPT_URI" --></p>
<p><!--#echo var = "SCRIPT_URL" --></p>

Результат

/www/frolan01/www/htdocs/samodel/ssi2_1.html

http://froland.ru/samodel/ssi2_1.html

/samodel/ssi2_1.html

Если заданная переменная не определена на данном сервере, выводится (none).

#set

Устанавливает значение переменной

Атрибуты: var, value (используются вместе)

var — определяет имя переменной;

value — определяет значение переменной.

ПРИМЕР

<!--#set var = "test1" value = "Тестируем директиву #set" -->
<p><!--#echo var = "test1" --></p>

Результат

Тестируем директиву #set

froland2@yandex.ru


 008470