В чем разница между модулями Apache с расширением «.c» и без него?

В чем разница между модулями Apache с расширением «.c» и без него?

Я использую Apache v2.4 на Ubuntu 14.04 и имею контейнеры/директивы такого формата

<IfModule mpm_prefork_module>
        # ...
</IfModule>

Однако я часто вижу, как в официальной документации Apache и на сайтах StackExchange упоминаются модули следующим образом:

<IfModule prefork.c>
        # ...
</IfModule>

Я много искал, в том числездесь-http://httpd.apache.org/docs/2.4/mod/core.html#ifmoduleи я не могу найти, в чем разница и когда следует использовать одно вместо другого?


Возьмем, к примеру, модуль перезаписи.

Из апачадокументация: директива ifmodule

Аргумент module может быть либо идентификатором модуля, либо именем файла модуля на момент его компиляции.
Например, rewrite_module — это идентификатор, а mod_rewrite.c — это имя файла.

И это очень часто можно увидеть в .htaccessфайлах.

<IfModule mod_rewrite.c>
    # ....
</IfModule>

Я grepоткрыл свой /etc/apache2каталог, и «mod_rewrite.c» нигде не определен.

На моем компьютере файл /etc/apache2/mods-available/rewrite.load
содержит:

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so

так это mod_rewrite.cссылка на файл windows/другой? в этом случае ссылка на него на машине linux будет некорректным синтаксисом?

решение1

На странице высвязанныйв, он содержит следующий текст:

Аргумент module может быть либо идентификатором модуля, либо именем файла модуля на момент его компиляции. Например, rewrite_module — это идентификатор, а mod_rewrite.c — имя файла. Если модуль состоит из нескольких исходных файлов, используйте имя файла, содержащего строку STANDARD20_MODULE_STUFF.

Используя приведенный пример, модуль перезаписи может называться как 'rewrite_module' (идентификатор) или mod_rewrite.c (имя файла). Оба варианта эквивалентны, и нет никакой разницы. Вы можете использовать любой из них.

Модуль с исходным файлом mod_rewrite.c компилируется в mod_rewrite.so, который будет у вас в файловой системе. В этом исходном файле есть строка 'module AP_MODULE_DECLARE_DATA rewrite_module;', которая объявляет модуль с именем 'rewrite_module'.

Модуль может называться «rewrite_module», что является идентификатором, или «mod_rewrite.c», что является исходным файлом, из которого он был скомпилирован.

Строка 'LoadModule' сообщает ему о необходимости загрузить модуль с идентификатором 'rewrite_module' из уже скомпилированного объекта mod_rewrite.so. При настройке этого можно ссылаться либо на идентификатор, либо на имя исходного файла, если оно вам известно.

решение2

Как уже отметил @DanielLawson, это четко описано на странице руководства Apache, на которую вы ссылаетесь.

Аргументом модуля может быть либо идентификатор модуля, либо имя файла модуля на момент его компиляции.

Имя файла модуля заканчивается нарасширение, так как C — это язык, на котором разработан Apache httpd.

Концепция идентификаторов модулей, в свою очередь, похожа на теги Stack Exchange. Ваш <IfModule mpm_prefork_module>блок гласит: если у вас есть какой-либо модуль, помеченный какmpm_prefork_module. Это обеспечивает большую гибкость в конфигурации — разные модули предлагают одинаковую функциональность, напримерmod_ssl.cиmod_gnutls.cкак естьssl_модульидентификатор.

Связанный контент