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

Mic*_*man 3 apache-2.4

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

<IfModule mpm_prefork_module>
        # ...
</IfModule>
Run Code Online (Sandbox Code Playgroud)

但是,我经常以这种方式在 apache 官方文档和 stackexchange 站点中看到引用的模块:

<IfModule prefork.c>
        # ...
</IfModule>
Run Code Online (Sandbox Code Playgroud)

我搜索了很多,包括这里- http://httpd.apache.org/docs/2.4/mod/core.html#ifmodule和我无法找到区别是什么,什么时候应该使用另一个?


以重写模块为例

来自 apache文档:ifmodule 指令

模块参数可以是模块标识符或模块在编译时的文件名。
例如,rewrite_module 是标识符,mod_rewrite.c 是文件名。

.htaccess文件中看到这个很常见

<IfModule mod_rewrite.c>
    # ....
</IfModule>
Run Code Online (Sandbox Code Playgroud)

grep已经编辑了我的/etc/apache2目录并且“mod_rewrite.c”没有在任何地方定义。

在我的机器上,该文件/etc/apache2/mods-available/rewrite.load
包含:

LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so
Run Code Online (Sandbox Code Playgroud)

所以是mod_rewrite.c对Windows/其他文件的引用吗?在哪种情况下在 linux 机器上引用它会是不正确的语法?

Dan*_*son 6

在您链接到的页面中,它包含以下文本:

模块参数可以是模块标识符或模块在编译时的文件名。例如,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' 的模块。当您配置它时,您可以参考标识符或源文件名(如果您知道的话)。