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

ШАГ 3


  • Ещё о переменных окружения
  • Назначение и изменение переменных (директивы #set и #echo)
  • Особенности переменных SSI

ЕЩЁ О ПЕРЕМЕННЫХ ОКРУЖЕНИЯ

Прошлый раз мы использовали переменную окружения DOCUMENT_URI для определения имён файлов HTML-страничек. Это лишь одна из великого множества переменных окружения.

Когда мы открываем ту или иную web-страницу, происходит своеобразная «стыковка» браузера и сервера. Для успешного соединения они должны передать друг другу определённую информацию. Для неё-то и существуют переменные окружения. Часть из них содержит информацию сервера, часть служит контейнерами для принятия информации от браузера.

Настройки каждого сервера индивидуальны, и наборы переменных окружения на разных серверах отличаются в деталях. Поскольку SSI зависит от настроек сервера, некоторые команды, существующие в принципе, могут не работать на данном сервере. Другие команды могут работать на разных серверах немного по-разному. Поэтому для полного грамотного использования SSI необходимо хорошо знать настройки своего сервера, а в ряде случаев — и перенастраивать их.

Полный список переменных окружения данного сервера выводится директивой #printenv.

Выведем этот вписок.

ПРИМЕЧАНИЕ

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

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

Список переменных окружения

UNIQUE_ID=W3tULXsW-onaQhd1MW39BQAAAIg
SCRIPT_URL=/samodel/ssi3.html
SCRIPT_URI=http://froland.ru/samodel/ssi3.html
HTTP_USER_AGENT=CCBot/2.0 (https://commoncrawl.org/faq/)
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_IF_MODIFIED_SINCE=Sun, 24 Jun 2018 05:08:47 GMT
HTTP_HOST=froland.ru
HTTP_CONNECTION=Keep-Alive
HTTP_ACCEPT_ENCODING=gzip
PATH=/usr/local/jdk/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/lib/courier-imap/sbin:/usr/lib/courier-imap/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/X11R6/bin:/root/bin:/opt/bin
LD_LIBRARY_PATH=/usr/local/apache/lib
SERVER_SIGNATURE=
SERVER_SOFTWARE=Apache/2.4.29 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4
SERVER_NAME=froland.ru
SERVER_ADDR=89.111.178.201
SERVER_PORT=80
REMOTE_ADDR=54.224.11.137
DOCUMENT_ROOT=/home/frolan01/public_html
REQUEST_SCHEME=http
CONTEXT_PREFIX=
CONTEXT_DOCUMENT_ROOT=/home/frolan01/public_html
SERVER_ADMIN=webmaster@frolan01.mass.hc.ru
SCRIPT_FILENAME=/home/frolan01/public_html/samodel/ssi3.html
REMOTE_PORT=37690
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/samodel/ssi3.html
SCRIPT_NAME=/samodel/ssi3.html
DATE_LOCAL=Tuesday, 21-Aug-2018 02:52:13 MSK
DATE_GMT=Monday, 20-Aug-2018 23:52:13 GMT
LAST_MODIFIED=Friday, 17-Nov-2017 06:20:40 MSK
DOCUMENT_URI=/samodel/ssi3.html
DOCUMENT_ARGS=
USER_NAME=frolan01
DOCUMENT_NAME=ssi3.html


ПРИМЕЧАНИЕ

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

Наиболее «продвинутые» пользователи смогут сами настроить кое-что из этого, например, в файле .htaccess.

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

НАЗНАЧЕНИЕ И ИЗМЕНЕНИЕ ПЕРЕМЕННЫХ
(ДИРЕКТИВЫ #set И #echo)

С помощью директивы #set мы можем назначить свои собственные переменные, а также изменить уже существующие.

Синтаксис

<!--#set var = "ИМЯ_ПЕРЕМЕННОЙ" value = "значение" -->

ПРИМЕЧАНИЕ

Поскольку значением атрибута var всегда является имя переменной, префикс $ здесь не нужен.

Начнём с изменения уже существующих.

В списке, выведенном директивой #printenv, есть переменная SERVER_ADMIN — почтовый адрес администратора сервера. Предположим, я хочу оставить на страничках свой почтовый адрес для контакта. Могу прописывать его вручную, а могу затолкать в переменную SERVER_ADMIN.

<!--#set var = "SERVER_ADMIN" value = "froland2@yandex.ru" -->

Теперь я могу вывести его директивой #echo. Она выводит на экран значения переменных и имеет атрибуты encoding и var (об атрибуте encoding — чуть ниже).

Синтаксис

<!--#echo var = "ИМЯ_ПЕРЕМЕННОЙ" -->

Поскольку она содержит текст, выводимый на экран, её можно вставлять в любые тэги форматирования HTML.

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

Результат

froland2@yandex.ru

Теперь снова выведем список переменных и увидим, что значение SERVER_ADMIN изменилось.

UNIQUE_ID=W3tULXsW-onaQhd1MW39BQAAAIg
SCRIPT_URL=/samodel/ssi3.html
SCRIPT_URI=http://froland.ru/samodel/ssi3.html
HTTP_USER_AGENT=CCBot/2.0 (https://commoncrawl.org/faq/)
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_IF_MODIFIED_SINCE=Sun, 24 Jun 2018 05:08:47 GMT
HTTP_HOST=froland.ru
HTTP_CONNECTION=Keep-Alive
HTTP_ACCEPT_ENCODING=gzip
PATH=/usr/local/jdk/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/lib/courier-imap/sbin:/usr/lib/courier-imap/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/X11R6/bin:/root/bin:/opt/bin
LD_LIBRARY_PATH=/usr/local/apache/lib
SERVER_SIGNATURE=
SERVER_SOFTWARE=Apache/2.4.29 (Unix) OpenSSL/1.0.1e-fips mod_bwlimited/1.4
SERVER_NAME=froland.ru
SERVER_ADDR=89.111.178.201
SERVER_PORT=80
REMOTE_ADDR=54.224.11.137
DOCUMENT_ROOT=/home/frolan01/public_html
REQUEST_SCHEME=http
CONTEXT_PREFIX=
CONTEXT_DOCUMENT_ROOT=/home/frolan01/public_html
SERVER_ADMIN=froland2@yandex.ru
SCRIPT_FILENAME=/home/frolan01/public_html/samodel/ssi3.html
REMOTE_PORT=37690
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=GET
QUERY_STRING=
REQUEST_URI=/samodel/ssi3.html
SCRIPT_NAME=/samodel/ssi3.html
DATE_LOCAL=Tuesday, 21-Aug-2018 02:52:13 MSK
DATE_GMT=Monday, 20-Aug-2018 23:52:13 GMT
LAST_MODIFIED=Friday, 17-Nov-2017 06:20:40 MSK
DOCUMENT_URI=/samodel/ssi3.html
DOCUMENT_ARGS=
USER_NAME=frolan01
DOCUMENT_NAME=ssi3.html

Точно так же можно назначать и свои собственные переменные.

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

Результат

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

ОСОБЕННОСТИ ПЕРЕМЕННЫХ SSI

«Время жизни» значений переменных

Обратите внимание: при изменении значения переменной окружения в списке несколькими абзацами выше ничего не изменилось. Переменная «живёт», как в старом анекдоте, «от меня до другого столба», то есть, до следующей инструкции назначения.

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

Точно так же ведут себя и наши собственные переменные.

Мы только что создали переменную test1, а теперь переназначим и посмотрим.

<!--#set var = "test1" value = "Бобик сдох" -->
<p><!--#echo var = "test1" --></p>

Результат

Бобик сдох

Интерпретация значений переменных в браузере

Строки значений переменных выводятся на экран именно в том виде, в котором были назначены. Если в строке переменной были использованы тэги HTML, то они не будут интерпретированы браузером. В коде HTML они будут заменены на спецсимволы, а на экране отобразятся в первозданном виде.

<!--#set var = "test1" value = "<h1>Заголовок</h1>" -->
<!--#echo var = "test1" -->

Результат

<h1>Заголовок</h1>

(Поскольку мы не заключали вывод текста ни в какие тэги, он выводится без форматирования.)

А если мы посмотрим в браузере исходный код страницы, то увидим в этом месте следующее:

&lt;h1&gt;Заголовок&lt;/h1&gt;

Не спасёт нас и запись значения спецсимволами. Они останутся без изменений и превратятся на экране в то же отображение тэгов.

<!--#set var = "test2" value = "&lt;h1&gt;Заголовок&lt;/h1&gt;" -->
<!--#echo var = "test2" -->

Результат

&lt;h1&gt;Заголовок&lt;/h1&gt;

Настройка интерпретации вывода переменных

В XSSI — расширенной версии SSI — у директивы #echo имеется атрибут encoding, который сообщает браузеру, как интерпретировать текст и символы языка HTML.

Значения:

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

ПРИМЕЧАНИЕ

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

Теперь настроим кодировку вывода нашей первой переменной:

<!--#echo encoding = "none" var = "test1" -->

Результат

Заголовок

Заданные спецсимволы также превращаются в работающие HTML-тзги (выводим вторую переменную):

<!--#echo encoding = "none" var = "test2" -->

Результат

<h1>Заголовок</h1>

Ну и попробуем из любопытства encoding = "url":

<!--#echo encoding = "url" var = "test1" --><br>
<!--#echo encoding = "url" var = "test2" -->

Результат

%3ch1%3e%c7%e0%e3%ee%eb%ee%e2%ee%ea%3c/h1%3e
<h1>%c7%e0%e3%ee%eb%ee%e2%ee%ea</h1>

Странно, но оба результата получились одинаковыми.


Следующий шаг >>


 002964