API, предоставляемое сервером Apache модулям для конфигурирования.
Обзор провел: Савенко Д.В.
Дата: 30.06.2005

Для описания функций, которые будут обрабатывать те или иные директивы конфигурации, модуль должен описать две структуры данных:
Первая -- общий список (структура module):

module my_module = {
  STANDARD20_MODULE_STUFF,
  my_create_dir_conf,		/* Create config rec for Directory */
  my_merge_dir_conf, 		/* Merge config rec for Directory */
  my_create_svr_conf,		/* Create config rec for Host */
  my_merge_svr_conf, 		/* Merge config rec for Host */
  my_cmds,           		/* Configuration directives */
  my_hooks
} ;
В этой структуре модуль должен определить указатели на соответствующие функции (кроме my_cmds, который является массивом структур command_rec), либо NULL, если он не собирается использовать какую-либо из функций.

Вторая структура -- это так называемая таблица комманд или директив. Она представляет собой оканчивающийся нулем массив примерно следующего вида:

command_rec my_cmds[] = {
{ "TransferLog", set_config_log, NULL, RSRC_CONF, TAKE1,
    "the filename of the access log" },
{ "LogFormat", log_format, NULL, RSRC_CONF, TAKE1,
      "a log format string (see docs)" },
{ NULL }
};
Где:
1. TransferLog -- имя директивы
2. set_config_log -- указатель на функцию, которая обрабатывает эту директиву
3. NULL (третий параметр) -- необязательный параметр, указывающий на дополнительную информацию, которую модуль должен определить сам
4. RSRC_CONF -- модификатор области видимости (httpd.conf, директория, .htaccess). Полный список возможных значений прилагается.
5. TAKE1 -- тип конфигурационной функции. Полный список значений прилагается.
6. "the filename of the access log" -- описание директивы.

Таким образом модуль ассоциирует определенные директивы конфигурационного файла с определенными функциями. Модуль может определить какую угодно структуру данных для хранения своих настроек, но заботиться о ней он должен сам. Это означает, что он должен сам выделять под нее память (за это отвечают функции my_create_dir_conf и my_create_svr_conf из структуры module). Удаляется структура автоматически, так как Apache предоставляет свой механизм управления памятью, основанные на временных пулах памяти, которые удаляются все разом, как только в них исчезла необходимость.

Теперь о том, как собственно читается конфигурационный файл. Если Apache находит директиву, ассоциированную с функцией некоего модуля, он вызывает эту функцию, а все параметры директивы передает в качестве обычной строки char*. Далее вызванная функция может распарсить эту строку, как ее душе угодно. (Это истинно только для TAKE1. Другие типы вызываются несколько по-другому (см. приложение 2))

Еще можно сказать о функциях merge (my_merge_dir_conf и my_merge_svr_conf). Из-за того, что конфигурационный файл имеет иерархическую структуру, некоторые директивы могут перекрываться в блоках конфигурационного файла (например, в блоке Directory). Чтобы разрулить возникшие неоднозначности, Apache вызывает функцию merge, задача которой решить, какое именно из определений использовать. Вообще, эта функция может делать все, что угодно, например, строить совершенно новый конфиг на основе двух, которые ей передали.

Вот, собственно, и весь механизм работы конфигурационной подсистемы Apache.

Приложение 1. Список возможных значений четвертого аргумента структуры command_rec:
RSRC_CONF - httpd.conf at top level or in a VirtualHost context. All directives using server config should use this, as other contexts are meaningless for a server config.
ACCESS_CONF - httpd.conf in a Directory context. This is appropriate to per-dir config directives for a server administrator only, and is often combined (using OR) with RSRC_CONF to allow its use anywhere within httpd.conf.
OR_LIMIT, OR_OPTIONS, OR_FILEINFO, OR_AUTHCFG, OR_INDEXES - extend to allow use of the directive in .htaccess according to AllowOverride setting.

Приложение 2. Список значений типа конфигурационной функции:
NO_ARGS (no args)
FLAG (a single On/Off arg)
TAKE1 (a single string arg)
TAKE2, AP_INIT_TAKE3, AP_INIT_TAKE12, etc - directives taking different numbers of string args
ITERATE (function will be called repeatedly with each of an unspecified number of arguments)
ITERATE2 (function will be called repeatedly with two arguments)
RAW_ARGS (function will be called with args unprocessed)