编写 apache 配置,并根据 apache 版本设置条件

编写 apache 配置,并根据 apache 版本设置条件

我想编写一个 Apache 服务器的配置,该配置应适用于 Apache-2.2 和 -2.4,无需任何修改。由于 v2.4 中有相当多的新模块需要加载,并且有一些修改后的指令,所以我需要一些条件语句。我想要的是类似这样的内容

<If ApacheVersion >= 2.4>
  LoadModule mod_only_in_2.4.so
</If>

但我还没找到正确的表达方式。有人能给我指点一下吗?

澄清我的动机:我正在开发一个服务器,我希望能够将其复制到服务器上并运行,而无需进一步依赖主机的配置。而且由于机器可以安装任一版本的 apache,所以我想要一个在两种情况下都能正常工作的配置。

答案1

您应该检查模块,而不是 Apache 版本。

例如:

<IfModule mod_authz_core.c>
Require all granted
</IfModule>

<IfModule !mod_authz_core.c>
Order deny,allow
Allow from all
</IfModule>

请注意,您无法提前猜测某人是否拥有特定的 Apache 版本;系统管理员有责任确保加载正确的模块。作为开发人员,您真正需要担心的只是根据可用的模块提供正确的指令。

作为系统管理员,您必须维护 Apache 2.2 和 2.4 的不同配置;这是无法避免的。幸运的是,每个配置管理系统都使这变得相对容易,如果您还没有使用这样的系统,那么您应该开始使用。

答案2

如果mod_version已加载(默认情况下在 Apache 2.2 和 2.4 中都应可用,但默认情况下不会加载),则可以使用<IfVersion>检查 Apache(且仅 Apache)版本的指令:

<IfVersion >= 2.3>
    # this happens only in versions greater or
    # equal 2.3.0.
</IfVersion>

取自文档的示例。

答案3

这是我最终做的事情:我编辑了启动脚本来设置一个指定 apache 版本的变量

apache_version_string=`$apache_bin -v|grep -oP "Apache/(\d\.\d)"`
if [[ $apache_version_string == "Apache/2.2" ]]; then
    server_flags=$server_flags" -DAPACHEv22"
 else
    if [[ $apache_version_string == "Apache/2.4" ]]; then
        server_flags=$server_flags" -DAPACHEv24"
    fi
fi

我在 Apache 配置中检查了这些定义

<IfDefine APACHEv24>
  LoadModule authz_core_module        /usr/lib/apache2/mod_authz_core.so
</IfDefine>

相关内容