Я использую 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_модульидентификатор.