SSI

Матеріал з Wiki.Zina
Перейти до навігації Перейти до пошуку

Кодировка

[ред. | ред. код]

Чтобы не портилась кодировка при выводе переменных — добавить encoding="none":

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

Переменные / Variables

[ред. | ред. код]

Здесь перечислены только те переменные, которые удается получить из обычный HTML страницы на нашем сервере.

<!--#echo var="HTTP_HOST" --> hearts-in-love.com
<!--#echo var="SERVER_NAME" --> hearts-in-love.com
<!--#echo var="SERVER_PORT" --> 443
<!--#echo var="SERVER_ADDR" --> 77.120.105.84
<!--#echo var="SERVER_PROTOCOL" --> HTTP/1.1
<!--#echo var="REQUEST_METHOD" --> GET
<!--#echo var="REQUEST_URI" --> /
<!--#echo var="DOCUMENT_URI" --> /
<!--#echo var="DOCUMENT_ROOT" --> /var/www/hearts/data/www/hearts-in-love.com
<!--#echo var="HTTP_CONNECTION" --> keep-alive
<!--#echo var="HTTP_ACCEPT" --> text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
<!--#echo var="HTTP_USER_AGENT" --> Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
<!--#echo var="REMOTE_ADDR" --> 37.53.93.49
<!--#echo var="REMOTE_PORT" --> 57102
<!--#echo var="DATE_GMT" --> Thursday, 25-Mar-2021 13:36:39 GMT
<!--#echo var="DATE_LOCAL" --> Thursday, 25-Mar-2021 15:36:39 EET

Различия в синтаксисе SSI старого и нового Apache и Nginx

[ред. | ред. код]

Нужно различать SSI, который использует Apache, и SSI, который использует Nginx:

В общем, у Nginx синтаксис похож на старый Apache, какой был до версии Apache 2.3.13, но с ограничениями, среди которых наиболее проблемное - нельзя использовать вложенность if. Обходится это тем, что вложенные правила if-else можно выносить в отдельные файлы, которые инклюдятся, типа:

<!--#if expr="$title = $issue_name" -->
	<!--#include virtual="/issue-cover.html" -->
<!--#else -->
	<!--#include virtual="/article-head.html" -->
<!--#endif -->

и затем внутри /article-head.html:

<!--#if expr="$REQUEST_URI = /vsrede/" -->
	<h1 class="title-article title-vsrede">В среде <!--#echo encoding="none" var="date_full" --> года</h1>
<!--#else -->
	<!--#include virtual="/head-author-title.html" -->
<!--#endif -->


Начиная с версии 2.3.13 Apache переключился на новый синтаксис ap_expr для условных выражений в элементах управления потоком #if.

Чтобы при локальной разработке на Apache использовать старый синтаксис, нужно в .htaccess добавить строку:

SSILegacyExprParser on

Новый синтаксис SSI Apache

[ред. | ред. код]

Есть ли значение у переменной

[ред. | ред. код]

Пример: определим переменную author:

<!--#set var="author" value="" -->

Проверим, заполнена ли она, через Unary operators (-n — если строка не пустая):

<!--#if expr='-n v("author")' -->
  Автор: <!--#echo encoding="none" var="author" -->
<!--#else -->
  Автор не указан
<!--#endif -->

Второй вариант синтаксиса — через регулярные выражения:

<!--#if expr="v('author') =~ /.+/"-->
  Автор: <!--#echo encoding="none" var="author" -->
<!--#else -->
  Автор не указан
<!--#endif -->

Одна переменная не равна другой

[ред. | ред. код]
<!--#if expr="v('title') != v('issue_name')" -->
  Это не обложка рубрики
<!--#endif -->

Проверка URL

[ред. | ред. код]

Вывести текущий URL:

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

Есть ли в URL index.html:

<!--#if expr="v('DOCUMENT_URI') =~ /index.html/"-->Да, есть index.html<!--#endif-->
<!--#if expr="%{DOCUMENT_URI} =~ /index.html/"-->Да, есть index.html<!--#endif-->
<!--#if expr="v('DOCUMENT_URI') !~ /index.html/"-->Нет, нету index.html<!--#endif-->

Главная страница — т.е. URL начинается с /:

<!--#if expr="v('DOCUMENT_URI') =~ m#^/index.html$#" -->Главная страница сайта<!--#endif-->
<!--#if expr="%{DOCUMENT_URI} =~ m#^/index.html$#" -->Главная страница сайта<!--#endif-->

Сниппеты SSI

[ред. | ред. код]
© Студія «Зіна дизайн» 1999-<!--#config timefmt="%Y" --><!--#echo var="DATE_LOCAL" -->

Не главная страница

[ред. | ред. код]
<!--#if expr="$DOCUMENT_URI != /^\/index.shtml/" -->...<!--#endif -->

Два условия

[ред. | ред. код]
<!--#if expr="$DOCUMENT_URI = /^\/reserve\// || $DOCUMENT_URI = /^\/rooms\//" -->
<!--#if expr="$DOCUMENT_URI != /^\/sitemap\/.+/ && $DOCUMENT_URI != /^\/vsrede\/.+/" -->

Установка старой версии Apache 2.2.22 для полной поддержки SSI

[ред. | ред. код]

Используем Ubuntu 16.04. Возможно, будет работать и на новых версиях Ubuntu.

Добавить PPA со старыми версиями:

sudo vim /etc/apt/sources.list.d/raring.list

Вставить строку:

deb http://old-releases.ubuntu.com/ubuntu/ raring main restricted universe multiverse

Обновить репозитории:

sudo apt update

Проверить доступные версии Apache:

apt-cache showpkg apache2

Установить подходящую версию Apache из доступных:

sudo apt install apache2=2.2.22-6ubuntu5

Включить в Apache поддержку SSI:

sudo a2enmod include

Настроить Apache:

sudo vim /etc/apache2/apache2.conf

Добавить в конец строки:

AcceptFilter http none
ServerName localhost
<Directory /home/romych/projects/>
      Options Indexes FollowSymLinks Includes
      AllowOverride None
      AddType text/html .html .htm .shtml
      AddHandler server-parsed .shtml .html .htm
      AddOutputFilter INCLUDES .html .htm .shtml
      DirectoryIndex index.shtml index.html index.htm
</Directory>

Поддержка старого синтаксиса SSI — Apache 2.2 в Vagrant

[ред. | ред. код]

Используем VirtualBox + Vagrant + бокс oshpilaf/ubuntu1404-php52 с Apache 2.2.12.

Сначала нужно установить VirtualBox подходящей версии — у Vagrant есть требования по совместимости. Список подходящих версий здесь: VirtualBox Provider | Vagrant.

vagrant box add oshpilaf/ubuntu1404-php52
cd ~/projects
vagrant init oshpilaf/ubuntu1404-php52
vim Vagrantfile

Раскомментировать строку:

config.vm.network "private_network", ip: "192.168.33.10"

Запустить виртуальную машину:

vagrant up

На Windows может потребоваться указывать более конкретно:

 vagrant up --provider=virtualbox

Проверить:

Зайти в виртуальную машину по SSH:

vagrant ssh

Включить в Apache поддержку SSI:

sudo a2enmod include

Настроим работу не в стандартной системной папке Apache /var/www (она требует рутовых прав, это неудобно), а в папке /vagrant, она же ~/projects на основном компьютере (т.е. это папка, из которой запущен vagrant up):

sudo vim /etc/apache2/apache2.conf 

Добавить в конец файла:

<Directory /vagrant/>
        Options Indexes FollowSymLinks Includes
        AllowOverride None
        AddOutputFilter INCLUDES .html .htm .shtml
        DirectoryIndex index.shtml index.html index.htm
</Directory>
ServerName localhost

Создать папку сайта:

mkdir /vagrant/www.test

Создать конфиг сайта:

sudo vim /etc/apache2/sites-available/www.test

Вставить в конфиг:

<VirtualHost *:80>
        ServerName www.test
        DocumentRoot /vagrant/www.test
</VirtualHost>

Отключаем стандартный сайт и включаем новый конфиг:

sudo a2dissite default
sudo a2ensite www.test
sudo /etc/init.d/apache2 reload

Проверить:

echo 'Это локальный сайт в Vagrant www.test' >> /vagrant/www.test/index.html

После этого можно работать с основной машины — закидывать в ~/projects/www.test/ файлы сайта и проверять в браузере http://192.168.33.10/

См. также

[ред. | ред. код]