SSI
Чтобы не портилась кодировка при выводе переменных — добавить encoding="none":
<!--#echo encoding="none" var="title" -->
Здесь перечислены только те переменные, которые удается получить из обычный 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, и SSI, который использует Nginx:
- Apache: http://httpd.apache.org/docs/current/expr.html
- Nginx: http://nginx.org/ru/docs/http/ngx_http_ssi_module.html
В общем, у 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
Пример: определим переменную 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:
<!--#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-->
© Студія «Зіна дизайн» 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\/.+/" -->
Используем 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>
Используем 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
Проверить:
- http://192.168.33.10/
ping 192.168.33.10
Зайти в виртуальную машину по 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/
- Server-side include commands for HTTP Server - IBM Documentation
- SSI Examples
- Apache
- Кодировка текста