我想编写一个 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>