Сегодня не совсем обычный пример, — это не пример кода или алгоритм, но метод установки парсера на сервера провайдера net.ru. (т.е. там, где находится этот сайт).

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

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

Мне выдавалось все время [undefined macro html] на любой странице сайта. Как оказалось причина была в том, что парсер не мог прочитать определения макросов из _macro.cfg да и не только из него, — не подключались никакие другие файлы с помощью ^macro_use[…].

Как оказалось, причина была в кривой переменной окружения DOCUMENT_ROOT. Для нормальной работы парсера (как написано в доках) она должна принимать значение = физический путь в файловой системе сервера до корня вашего сервера (виртуального сервера), т.е. например в Windows, если Apache стоит в каталоге d:\apache и корень информационного наполнения находится в каталоге d:\apache\www, данная переменная должна принимать значение: d:/apache/www. Проверить это можно оператором ^env[DOCUMENT_ROOT]. Под Unix пути соответственно другие.

Вызов ^env[DOCUMENT_ROOT] на удаленном сервере давал /users, т.е. переменная DOCUMENT_ROOT совсем не указывает на реальное размещение корня виртуального сервера, и поэтому парсер не мог найти _macro.cfg в корне, ни подключать никакие определения макросов из файлов.

Для решения проблемы мне в форуме по парсеру предложили писать полный путь к подключаемому файлу при использовании ^macro_use[…] и подключать _macro.cfg в каждом файле вручную и это сработало.

Для выяснения полного пути к корню сервера надо сделать вызов ^env[PATH_TRANSLATED] из любого документа (можно из документа по умолчанию) находящегося в корне сервера. На net.ru такой вызов дает вот что:

/users/e/g/egoroff.spb.ru/html/www/file_name.html
Замечание:

На net.ru все html документы должны находится в каталоге html или в его подкаталогах (у меня они находятся в подкаталоге www)

После всех этих манипуляций получаем физический путь к корню:

/users/e/g/egoroff.spb.ru/html/www

Создаем соответствующую переменную (у меня ^var[document.root;/e/g/egoroff.spb.ru/html/www]) и в каждом html файле делаем такой вызов:

^macro_use[^var[document.root]/macro.cfg]

Для всех других подключений файлов с помощью данного оператора также используем эту переменную.

Для удобства работы я сделал файл _macro.cfg очень простым:

@autoexec[]
# Document root
# на локальной машине следующая строчка должна быть закомментирована
^var[document.root;/e/g/egoroff.spb.ru/html/www]

^macro_use[^var[document.root]/macro_real.cfg]

и его я и подключаю вручную в каждом html файле, а файл _macro_real.cfg и является «настоящим» _macro.cfg

Да и еще, — Parser должен находится в корневом каталоге иначе ничего не будет работать и соответственно строка, назначающая его обработчиком html файлов в .htaccess будет иметь вид:

AddHandler parsed-html .html
Action parsed-html /parser2.cgi
2002-02-26 20:13:54 UTC hosting installation parser web