Динамические страницы через SSI и PHP

Во всех манулах по SSI рекомендуется создать файлы заголовка, футера и т.д. а потом инклудить (включать) из в каждую страницу. Мало того что это муторно и некрасиво, так ещё и создаёт дополнительные проблемы при при серьёзных изменениях на сайте.

Логичнее было бы автоматически вставлять шаблон для всех страниц сайта с определённым (дабы не портить текстовые и прочие не HTML страницы на сайте) расширением. Я расскажу вам как это сделать.

Способ одинаково работает как на SSI так и на PHP. Он дико прост и мне странно что я не смог нагуглить готовое решение, возможно плохо искал, но вместо того чтобы тратить время на поиск, я сделал всё сам.

Простейщее использование шаблонов на SSI и PHP

Я последовательно приведу листинги необходимых файлов с пояснениями.

Файлы шаблонов:

footer.html

 Любой HTML фрагмент - подвал сайта

header.html

 Любой HTML фрагмент - шапка сайта

Файл(ы) контента

index.html

 Любой HTML фрагмент - чистый контент, без инклюдов и т.п.

Обработчики

engine.html - вариант на SSI

<!--Define template names and physical page ext-->
<!--#set var="ext" value=".html"-->
<!--#set var="header" value="header${ext}"-->
<!--#set var="footer" value="footer${ext}"-->
<!--#set var="mypage" value="${QUERY_STRING}${ext}"-->
<!--including templates and page-->
<!--#include virtual="$header" -->
<!--#include virtual="$mypage" -->
<!--#include virtual="$footer" -->

engine.php - вариант на PHP

<?
#Define template names and physical page ext
$ext=".html";
$header="header".$ext;
$footer="footer".$ext;
$mypage = $_SERVER['QUERY_STRING'].$ext;

#including templates and page
include ($header);
include ($mypage);
include ($footer);
?>

В обоих обработчиках важно обратить внимание на переменную ext. Как вы догадались, это расширение файлов контента, физических файлов на сервере. В ссылках на сайте мы будем использовать другое расширение. Конечно вы можете использовать свои расширения, важно лишь то чтобы расширение физических файлов и ссылок сайта не совпадали. Варианты: htm, html, shtml, phtml, php. Вы можете использовать любые другие, но внесите изменения в конфигурацию сервера и настройку обработчика. Расщирение файла обработчика может быть любым, но оно не должно совпадать с расщирением ссылок на сайте.

Конфигурация сервера

.htaccess

Options -Indexes
DirectoryIndex index.phtml
AddHandler server-parsed .html .htm
#AddHandler application/x-httpd-php .php .html .htm

RewriteEngine On 
RewriteBase /

#uncoment for site on SSI
#RewriteRule ^$ engine.html?index [QSA,L]
#RewriteRule ^(.*)/$ engine.html?$1/index [QSA,L]
#RewriteRule ^(.*).(shtml)$ engine.html?$1 [QSA,L]

#uncoment for site on PHP
RewriteRule ^$ engine.php?index [QSA,L]
RewriteRule ^(.*)/$ engine.php?$1/index [QSA,L]
RewriteRule ^(.*).(phtml)$ engine.php?$1 [QSA,L]

Это самое интересное, поясню построчно:
Options -Indexes - отключаем возможность просматривать листинг каталога
DirectoryIndex index.phtml - важный параметр, расширение должно соответствовать расширениям в ссылках вашего сайта, не физическим файлам.
AddHandler server-parsed .html .htm - только для SSI включаем обработку файлов .html .htm, как .shtml, можете добавить свои.
#AddHandler application/x-httpd-php .php .html .htm - раскомментируйте, если вы используете PHP версию и у вас "не работает", хотя обычно серверы по умолчанию на обработку этих файлов.
RewriteEngine On - активируем модуль для преобразования средствами Апача
RewriteBase / - необязательная строка, зависит от настроек сервера, необходима, например, для доменов 3го уровня.
Далее следуют группы правил преобразования для SSI и PHP, конечно оба блока вам не нужны, поэтому можно оставить только нужный, а другой удалить или закомментировать (символом # в начале строки). Обратите внимание, в примере закомментированна SSI версия.
Правил по 3, они действуют на корень сайта, каталоги и файлы с указанным (shtml или phtml) расширением соответственно. Если в ссылках на сайте другое расширение, измените его тут и в директиве DirectoryIndex.

Для проверки работоспособности создайте файлы с указанными именами, скопирйте в них содержимое, загрузите на сервер. Вы увидите результат footer.html, header.html и index.html как 1й HTML страницы.

Накладные расходы

Если вы осуществляете переезд сайта, как былов моём случае, то помимо переименовки файлов, необходимо внести изменение в логику, например переменная $DOCUMENT_NAME перестанет отображать текущую страницу, однако она легко заменяется переменной $mypage из обработчика.

Так же мне пришлось изменить расширения в инклудах внутри шаблона - привести в соответствии с физическими файлами.

Ну и конечно, вычистить все инклуды в отдельных страницах, оставив чистый контент.

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

Удачи!

Метки: , , ,

Leave a comment


Comment moderation is enabled on this site. This means that your comment will not be visible until it has been approved by an editor.