在apache配置中检测Apache版本?

Let*_*ion 21 apache .htaccess

tl; dr:如何在.conf或.htaccess文件中执行以下操作:

<IfApache22>
  # Do A
</IfApache22>
<IfApache24>
  # Do B
</IfApache24>
Run Code Online (Sandbox Code Playgroud)

更长的问题:

在Apache 2.4中,旧的Order被弃用而不是Require.

在我的.htaccess文件中

<FilesMatch "\.(long|list|file|types)$">
  Order allow,deny
</FilesMatch>
Run Code Online (Sandbox Code Playgroud)

这意味着除非启用access_compat,否则Apache无法启动.虽然这样做提供了一个有用的解决方法,但我想要一个适用于这两种语法的解决方案,因为配置将分发给许多服务器.问题是如何检测Apache的当前版本并应用正确的指令.

我打算将该文件用于许多人分发和使用的框架,我无法控制/保证他们有或没有任何特定的服务器设置,这就是为什么我希望文件是2.2/2.4"不可知论".

小智 31

我用过的黑客.

# Apache 2.2
<IfModule !mod_authz_core.c>
    Satisfy Any
</IfModule>

# Apache 2.4
<IfModule mod_authz_core.c>
    Require all granted
</IfModule>
Run Code Online (Sandbox Code Playgroud)


wei*_*dan 17

假设您安装了mod_version(默认情况下会发送许多发行版),您可以执行以下操作:

<IfVersion >= 2.4>
    # Require ...
</IfVersion>
<IfVersion < 2.4>
    # Order ...
    # Deny ...
    # Allow ...
</IfVersion>
Run Code Online (Sandbox Code Playgroud)

  • 我推荐这个答案.如果你能承受额外的依赖,这种方法就更清晰了.此外,如果在接受的答案中使用方法时曾经禁用mod_authz_core,那么配置文件将假定它在2.2上运行并继续运行.在这里删除mod_version只是意味着服务器将拒绝启动. (3认同)

pau*_*sm4 2

您可以在同一主机上运行不同版本的 Apache。问:单独的配置文件位于不同的目录中有什么问题?老实说,我相信这可能是最干净的方法......

不过,Apache .conf 文件允许使用<IfDefine>,您可以在运行时使用“-D”指定:

http://httpd.apache.org/docs/2.0/mod/core.html#ifdefine