Главная » HTML5 » SSI вставки на стороне сервера
241 1  

SSI вставки на стороне сервера

SSI вставки на стороне сервера - малоизвестый язык для динамической «сборки» веб-страниц на сервере реализованы в веб-сервере Apache при помощи модуля mod_include.

Шаблонизатор SSI - HTML5-SSI-RULLAN

Документация Apache по mod_include - смотреть

(SSI расшифровывается как Server Side Include. SSI) bully Его огромный плюс - Это моментальная скорость обработки сервером!!!

Включение механизма Server-Side Includes

Любой документ, у которого будет установлен обработчик "server-parsed" будет сканироваться этим модулем, если включена опция "Includes". Если вы имеете малое количество документов с SSI, то лучше всего в файле httpd.conf указать следующее:

AddType text/html .shtml
AddHandler server-parsed .shtml

и устанавливать у таких файлов расширение .shtml. Если же все или почти все документы будут иметь директивы SSI, то лучше в файле конфигурации указать:

AddHandler server-parsed .html

И не забудьте включить в опции директории узла опцию Includes:

Options +Includes

Конечно в этой строке могут быть и другие нужные вам опции.


crying Но как правило достаточно и внести правки в .htaccess:

Options +Includes
AddType text/html .html .shtml
AddHandler server-parsed .html .htm
winked раньше чтобы работали вставки ssi нужно было давать файлам расширение .shtml, но с 2018 года (в зависимости от верси Apache). Сейчас можно свободно использовать обычное расширение статических файлов - .html

SSI server apache 

Что может SSI?

  • позволяет включать в текст страницы другие SSI-страницы,
  • вызывать внешние CGI-скрипты,
  • реализовывать условные операции (if/else),
  • работать с переменными и т. п. (Хранить переменные можно в отдельном файле fellow)
  • делать запросы в базу данных

Примеры использования SSI:

1. Вставка содержимого из другого файла:

<!--#include virtual="/aa-resurs/vstavku/header.htm"-->


1.2 Вывод служебной информации

Твой IP - <!--#echo var="REMOTE_ADDR"--> <BR>
Твой броузер - <!--#echo var="HTTP_USER_AGENT"--> <BR>
Мой сервер - <!--#echo var="SERVER_NAME"--> <BR>
Ты пришел со страницы - <!--#echo var="HTTP_REFERER"--> <BR>

<!--#config timefmt="%s"-->
<!--#flastmod file="ssi.shtml"--> <BR>
Время модификации файла этой страницы в читабельном виде:
<!--#config timefmt="%d.%m.%Y %H:%M:%S"-->
<!--#flastmod file="ssi.shtml"--> <BR>
Вывод:
Время модификации файла этой страницы в секундах с 01.01.1970: 1502632649
Время модификации файла этой страницы в читабельном виде: 13.08.2017 16:57:29

2. Директивы SSI:

echo Вставка в документ переменных среды (браузер, дата, имя документа, ...).
include Включение файла в HTML документ.
fsize Включение размера файла в HTML документ.
flastmod  Включение даты последней модификации файла в HTML документ.
exec Выполнение внешнего исполняемого файла (CGI программы). Выходной поток данных (стандартный вывод) этой программы включается в документ.
config Установка параметров для SSI+ команд.
odbc Обращение к внешней ODBC СУБД.
email Отправка электронной почты или представление формы.
if Условный оператор, управляющий выполнением других команд SSI и вывода документа.
goto Оператор перехода на определенную SSI метку (label).
label Метка в документе.
break Остановка вывода документа.



3. Условия в SSI:

Условие - это либо строка, которая является истинной, если непустая, или набор операторов сравнения строк. Операторы могут быть =,!=,<,<=,> и >. Если вторая строка заключена в "/"(слэши), то условие истинно, если в первой строке встречается хоть одно вхождение второй строки. Можно объединять несколько операторов сравнения с помощью операторов &&(И) и ||(ИЛИ). Для группирования условий используются "()"(скобки).

3.1 Примеры условий по url:

Пример 1

<!--#if expr='v("DOCUMENT_NAME")=~/about.html/'-->
<a class="active" href="#">
<!--#else -->
<a href="about.html">
<!--#endif -->
About</a>

Пример 2

<!--#if expr="%{DOCUMENT_URI} =~ /product/"-->
Product path
<!--#else-->
Some other path
<!--#endif-->

3.3 Примеры условий по сравнению переменных:

Допустим переменная  GOROD равняется значению Киев
(<!--#set var="GOROD" value="Киев" -->)

пример 1:
<!--#if expr='v("GOROD")=~/nonnn/'--> //если перем. "GOROD" не равна значению "Киев"
Нет такого города    //сделается вывод этой строки
<!--#else -->  //а если значение другое чем "nonnn"
<!--#echo var="GOROD" --> //тогда сделать вывод переменной "GOROD"
<!--#endif --> //конец условия

пример 2:
<!--#if expr='v("GOROD") = "Киев"' -->  //если перем. "GOROD" равна "Киев"
<!--#echo var="GOROD" -->    //сделается вывод этой переменной. Можно любое слово
<!--#endif -->//конец условия

пример 3 с двумя условиями:
<!--#if expr="УСЛОВИЕ1" -->
HTML-код, который будет выводиться, если УСЛОВИЕ1 истинно
<--#elif expr="УСЛОВИЕ2" -->
HTML-код, который будет выводиться, если УСЛОВИЕ1 ложно, а УСЛОВИЕ2 истинно
<--#else -->
HTML-код, который будет выводиться, если все условия ложны
<--#endif -->

3.3. Если откуда-то пришел:

<!--#if expr='-R "10.0.0.0/8"' -->
from local net
<!--#else -->
from somewhere else
<!--#endif -->

3.4. Если переменная содержит:

В приведенном ниже примере будет напечатано «foo is bar», если для переменной foo установлено значение «bar».

<!--#if expr='v("foo") = "bar"' -->
foo is bar
<!--#endif -->

 Вывод рандомного текста:


Описание:

1 строка. Делаем конфиг временни для вывода только секунд.

2 строка. Пременной RND присваиваем текущую секунду
3. строка. Выводим в нужном месте эту секунду.

<!--#config timefmt="%S"-->
<!--#set var="RND" value="$DATE_LOCAL"-->
получаем число текущей секунды : <!--#echo var="RND"-->

Или через переменную которая сравнивает по числу:

<!--#config timefmt="%S" -->
<!--#set var="rand" value="$DATE_LOCAL" -->
<!--#if expr="$rand = /00/" -->
<!--#include virtual="rand_content_0.txt" -->
<!--#elif expr="$rand = /01/" -->
<!--#include virtual="rand_content_1.txt" -->
<!--#elif expr="$rand = /02/" -->
<!--#include virtual="rand_content_2.txt" -->
<!--#elif expr="$rand = /03/" -->
<!--#include virtual="rand_content_3.txt" -->
<!--#else -->
<!--#include virtual="fall_back_content.txt" -->
<!--#endif --> 

 Вывод содержимого для печати с браузера:

Ссылка на верстю для печати:
<a href="<!--#echo var="DOCUMENT_URI" -->?print ">Print this page</a> 

И сама часть текста для печати:
<!--#if expr="$QUERY_STRING = 'print'" -->
<p>Текст на печать</p>
<!--#else -->
<p>Текст на экране</p>
<!--#endif -->


Все примеры условных выражений:

Табл. 1. Условные выражения
Условие Описание
string1 ~= /string2/ истинно или равно
string1 ~ string2 Строка str пустая.
string1 = string2 Значение str1 равно str2.
string1 != string2 Значение str1 НЕ равно str2.
string1 < string2 Значение str1 меньше str2.
str1 <= str2 Значение str1 меньше или равно str2.
str1 > str2 Значение str1 больше str2.
string1 >= string2 Значение str1 больше или равно str2.
str1 && str2 Строка str1 И строка str2 не пустые.
str1 || str2 Строка str1 ИЛИ строка str2 не пустые.

*belay   "=" и "!=" имеют больший приоритет, чем "&&" и "||", а "!" имеет наивысший приоритет.


4. Вывод размера файла:

<!--#config sizefmt="abbrev"--><!--#fsize file="proba.html"--> 
Выводит размер файла в килобайтах: (17k)
<!--#config sizefmt="bytes"--><!--#fsize file="proba.html"--> 
Выводит размер файла в байтах (17,076)


5. Вывод даты и последней модификации файла или страницы где размещен сам код:

// document
<a href=pricelst.doc>Скачать Прайс</a>
<!--#config timefmt="%d.%m.%y" -->
(MS Word 6.0/95, <!--#flastmod virtual="pricelst.doc" -->)

// stranica
<!--#config timefmt="%G-%m-%d" -->
<p>Эта страница модифицирована: <!--#echo var="LAST_MODIFIED"--></p>


5.1 Выводим дату в Нужном формате:

Cтандартный вывод даты в SSI:

<!--#echo var="DATE_LOCAL" -->
или
<!--#echo var="DATE_GMT" -->
//пишем переменную
<!--#config timefmt="%G" -->
<!--#set var="YEAR" value="$DATE_LOCAL"-->

//В нужном месте вставляем
<!--#echo var="YEAR"-->
//Получение дня недели

<!--#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="вторник" -->
<!--#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"--> 
Формат Описание Пример
%a Краткое название дня недели Mon
%A Полное название дня недели Monday
%b Аббревиатура названия месяца Dec
%B Полное название месяца December
%d День месяца 01 (не 1)
%D Дата в формате "%m/%d/%y" 12/31/99
%e День месяца 13
%H Часы в 24-часовом формате 13
%I Часы в 12-часовом формате 01
%j День года 235
%m Номер месяца 01
%M Минуты 03
%p AM/PM (до полудня/после) AM
%r Время в формате "I:M:S p" 11:35:46 PM
%S Секунды 34
%s Время в секундах с 01.01.1970 957228726
%T Время в формате "%H:%M:%S" 14:05:34
%U Неделя года 16
%w Номер дня недели 4
%y Год в формате ГГ 99
%Y Год в формате ГГГГ 1999
%Z Временная зона MSK


6. Отдельная часть кода для нужного браузера

<!--#if expr="$HTTP_USER_AGENT=/Mozilla\/4/ || $HTTP_USER_AGENT=/Mozilla\/5/" -->
Если версия браузера не ни же 4 или 5, то вывести вариант дизайна, использующий, например, DHTML
<!--#else -->
Здесь вывести простой дизайн
<!--#endif -->

7. Подсветить меню нанужной странице:

8. Как в SSI вставить фрейм?

<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 -->


9.1  Параметр cmd
Запускает указанную командную строку с использованием локального интерпретатора.

<!--#exec cmd="команда"-->
Например, строка <!--#exec cmd="/usr/bin/date" --> исполняет Unix-команду date.

9.2 Параметр cgi

Выполняет CGI-программу и результат её выполнения вставляет в указанное место. В качестве параметра указывается адрес программы.

<!--#exec cgi="URL"-->

Использование директивы exec

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>SSI</title>
</head>
<body>
<p>Всего прочитало эту страницу <!--#exec cgi="/counter.pl"-->
человек.</p>
</body>
</html>

В данном примере запускается программа counter.pl, написанная на Perl, которая подсчитывает число посетителей данной страницы и записывает его в файл или в базу данных. После этого результат отображается в месте, где стоит строка <!--#exec cgi="/counter.pl"-->.


10. Обработка формы в SSI:

Сама форма и сообщение о умпешной отправки находится в одном файле - contact.htm

<!--#if expr="$QUERY_STRING = 'submitted'" -->
<p>Спасибо Ваше письмо отправлено.</p>
<!--#else -->
<form method="post" action="feedback.php">
<input type="hidden" name="redirect" value="contact.shtml?submitted" />
.......
</form>
<!--#endif-->


11. Вывод разного содержимого для разных USER:

<!--#if expr="$REMOTE_USER = 'user1'" -->
Welcome user1, you will now be redirected to your personal page.
To access your page directly <a href="user1/page.shtml">click here</a>.
<!--#elif expr="$REMOTE_USER = 'user2'" -->
Welcome user2, you will now be redirected to your personal page.
To access your page directly <a href="user2/page.shtml">click here</a>.
<!--#else -->
Should you BE here? Problems email con@dom.com
<!--#endif --> 

* Параметр errmsg устанавливает сообщение, отображаемое при возникновении ошибок. По умолчанию выводится текст [an error occurred while processing this directive], но вы можете поменять его на свой, да ещё написав по-русски. Синтаксис следующий.

<!--#config errmsg="Сообщение об ошибке"-->

источники:

- модуль - Apache Module mod_include

- Все команды w3.org
- Википедия

- htmlbook.ru


Переменные SSI:

Команда: <!--#printenv -->  выводит весь список переменных окружения

<pre>
<!--#printenv -->
</pre>


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

При использовании SSI общий синтаксис вывода определенной переменной окружения будет следующий.

<!--#echo var="переменная"-->

Как пользоватся переменными в SSI?

<!--#set var="I_TITLE" value="Заголовок сайта" -->
<!--#set var="I_DESCRIPTION" value="Простой и наглядный редактор каскадных стилей. Простой и понятный интерфейс." -->
<!--#set var="I_RATING" value="1" -->
<!--#set var="I_PIC" value="ps.gif" -->
<!--#set var="I_PIC_W" value="300" -->
<!--#set var="I_PIC_H" value="225" -->
<!--#set var="I_SITE" value="" -->
<!--#set var="I_PAGE" value="http://rullan.in.ua/prime/" -->
<!--#set var="I_ARCHIVE" value="" -->
<!--#set var="I_LOCALARCHIVE" value="" -->
<!--#set var="I_PLATFORM" value="Windows 95/NT" -->
<!--#set var="I_STATUS" value="Free" -->


<html><head>
   <title>Web Club Repository. <!--#echo var="TITLE" --></title>
   <meta http-equiv="Content-Type" content="text/html">
   <meta name="keywords" content="<!--#echo var="KEYWORDS" -->">
   <meta name="description" content="<!--#echo var="I_DESCRIPTION" -->">
   <link rel="stylesheet" type="text/css" href="/webclub2.css">
</head>
<body>
<table>
<tr><td>
<h1><!--#echo var="I_TITLE" --></h1>
</td></tr></table>
<!--#if expr="$I_PIC" -->
<br>
<table>
<tr><td align="center" valign="middle">
<img src="<!--#echo var="I_PIC" -->"
 width="<!--#echo var="I_PIC_W" -->"
height="<!--#echo var="I_PIC_H" -->" border=0>
</td></tr></table>
<!--#endif -->
<p>
<!--#if expr="$I_SITE" -->
<b>Узел поддержки</b>:<a href="<!--#echo var="I_SITE" -->">
<!--#echo var="I_SITE" --></a><br>
<!--#endif -->

<!--#if expr="$I_PAGE" -->
<b>Домашняя страница</b>:<a href="<!--#echo var="I_PAGE" -->">
<!--#echo var="I_PAGE" --></a><br>
<!--#endif -->

<!--#if expr="$I_ARCHIVE" -->
<b>Она сама</b>:<a href="<!--#echo var="I_ARCHIVE" -->">
<!--#echo var="I_ARCHIVE" --></a><br>
<!--#endif -->

<!--#if expr="$I_LOCALARCHIVE" -->
<b>Она сама у нас</b>:
 <a href="<!--#echo var="I_LOCALARCHIVE" -->">
<!--#echo var="I_LOCALARCHIVE" --></a><br>
<!--#endif -->

<!--#if expr="$I_PLATFORM" -->
<b>Платформа</b>: <!--#echo var="I_PLATFORM" --><br>
<!--#endif -->
<!--#if expr="$I_STATUS" -->
<b>Статус</b>: <!--#echo var="I_STATUS" --><br>
<!--#endif -->
</p>
<p align="justify">
<!--#if expr="$I_DESCRIPTION" -->
<!--#echo var="I_DESCRIPTION" -->
<!--#else -->
No description.
<!--#endif -->
</p>

<!--#include virtual="/materials/footer.html"-->
</body>
</html>


Список ВСТРОЕНЫХ перменных в SSI:

 Например команда: <!--#echo var="REQUEST_URI" -->  сделает вывод пути к текущему файлу.
 Это можно использовать в (<link rel="canonical" href="<!--#echo var="REQUEST_URI" -->"  />)
-------
 DOCUMENT_ROOT=/webdata/citforum/htdocs
 HTTP_ACCEPT=*/*
 HTTP_ACCEPT_LANGUAGE=ru
 HTTP_CONNECTION=keep-alive
 HTTP_HOST=www.citforum.ru
 HTTP_REFERER=http://vakh.online.com.ua/promo/library/index.html
 HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt)
 HTTP_VIA=1.1 ce
 HTTP_X_FORWARDED_FOR=213.59.141.209
 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin
 REMOTE_ADDR=213.59.136.10
 REMOTE_HOST=nat-cisco-gw.net.kht.ru
 REMOTE_PORT=41305
 SCRIPT_FILENAME=/webdata/citforum/htdocs/internet/html/ssi.shtml
 SERVER_ADDR=195.230.75.98
 SERVER_ADMIN=info@citforum.ru
 SERVER_NAME=www.citforum.ru
 SERVER_PORT=80
 SERVER_SIGNATURE=
 SERVER_SOFTWARE=Apache/1.3.12 (Unix) mod_ssl/2.6.2 OpenSSL/0.9.4
 GATEWAY_INTERFACE=CGI/1.1
 SERVER_PROTOCOL=HTTP/1.1
 REQUEST_METHOD=GET
 QUERY_STRING=
 REQUEST_URI=/internet/html/ssi.shtml
 SCRIPT_NAME=/internet/html/ssi.shtml
 DATE_LOCAL=11.07.2001 10:44:14
 DATE_GMT=11.07.2001 06:44:14
 LAST_MODIFIED=21.06.2000 16:31:33
 DOCUMENT_URI=/internet/html/ssi.shtml
 DOCUMENT_PATH_INFO=
 USER_NAME=andreya
 DOCUMENT_NAME=ssi.shtml

Некоторые переменные с их описанием перечислены в табл. 1. Заметьте, что все имена пишутся заглавными символами. Хотя это условие и необязательно, именно такая форма записи является традиционной и устоявшейся.

Табл. 1. Список переменных окружения
Переменная Описание
DOCUMENT_ROOT Путь к корневой папке сайта. Для локального веб-сервера значение может принимать вид z:/home/htmlbook.ru/www, а в других случаях зависит от операционной системы сервера и используемого программного обеспечения.
GATEWAY_INTERFACE Версия CGI (Common Gateway Interface, общий шлюзовый интерфейс). Значение обычно равно CGI/1.1.
HTTP_ACCEPT Типы файлов, которые способен принять браузер. В качестве значения возвращается список поддерживаемых MIME-типов разделенных между собой запятой, например: text/html, application/xhtml+xml.
HTTP_CONNECTION Тип соединения браузера с веб-сервером. Так, значение keep-alive означает, что браузер поддерживает постоянное соединение с сервером. При этом в течение одного сеанса соединения разрешено делать несколько запросов. Повторного соединения в таком случае уже не происходит.
HTTP_HOST Доменное имя сайта. Обычно различают имена с префиксом www (www.htmlbook.ru) и без него (htmlbook.ru). Переменная вернёт тот адрес сайта, который указан в адресной строке браузера.
HTTP_REFERER Адрес страницы, с которой пользователь перешел на данный сайт, он еще называется реферер.
HTTP_USER_AGENT

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

Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2

говорит, что пользователь использует браузер Firefox 6.0.2 под операционной системой Windows 7.

QUERY_STRING Запрос, который указан в адресной строке после вопросительного знака (?). Обычно пишется в форме «переменная=значение», где переменные разделяются между собой амперсандом (&). Так, при написании адреса http://htmlbook.ru/?id=5&slv=34 будет возвращено значение id=5&slv=34.
REMOTE_ADDR IP-адрес посетителя сайта.
REQUEST_METHOD Метод отправки данных на сервер. По умолчанию применяется метод GET.
REQUEST_URI Адрес запрашиваемого документа. Отсчёт ведётся от корня сайта, т.е. для полного адреса http://htmlbook.ru/1.html вернется значение 1.html.
SERVER_ADDR IP-адрес компьютера, на котором размещается сайт.
SERVER_ADMIN Адрес электронной почты администратора сайта.
SERVER_NAME Имя сервера.
SERVER_PORT Порт, по которому ожидается получение данных.
SERVER_PROTOCOL Протокол для получения и отправки данных. Значение обычно равно HTTP/1.1.
SERVER_SOFTWARE Программное обеспечение установленное на сервере. Для веб-сервера Apache возвращается номер версии (Apache/2.2.4), а также версия PHP (PHP/5.3.3).


admin
0
5 марта 2021 23:55

Ошибка в SSI  - (none) - появляется при неправильной настройки .htaccess или если нету такой переменной


Оставить свой комментарий:

Опыт в веб разработке:

2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
1979
2020