带有和不带有“.c”扩展名的 apache 模块有什么区别?

带有和不带有“.c”扩展名的 apache 模块有什么区别?

我在 Ubuntu 14.04 上运行 apache v2.4,并且有这种格式的容器/指令

<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”行告诉它从已编译的对象 mod_rewrite.so 中加载带有标识符“rewrite_module”的模块。配置此项时,您可以引用标识符或源文件名(如果您知道的话)。

答案2

正如@DanielLawson 已经指出的那样,这在您链接到的 Apache 手册页中有清楚地描述。

模块参数可以是模块标识符,也可以是模块编译时的文件名。

模块的文件名以。C扩展,因为 Apache httpd 是用 C 语言开发的。

模块标识符的概念类似于 Stack Exchange 的标签。您的<IfModule mpm_prefork_module>区块内容为:如果您有任何标记为mpm_prefork_module. 这使得配置更加灵活 - 不同的模块提供相同的功能,例如mod_ssl.cmod_gnutls.c都有ssl_模块标识符。

相关内容