在apache配置中检测Apache版本?

时间:2012-05-22 17:42:51

标签: apache .htaccess

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

<IfApache22>
  # Do A
</IfApache22>
<IfApache24>
  # Do B
</IfApache24>

更长的问题:

使用Apache 2.4旧的Order get被弃用,而不是Require

在我的.htaccess文件中

<FilesMatch "\.(long|list|file|types)$">
  Order allow,deny
</FilesMatch>

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

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

5 个答案:

答案 0 :(得分:30)

我曾经使用的黑客。

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

# Apache 2.4
<IfModule mod_authz_core.c>
    Require all granted
</IfModule>

答案 1 :(得分:15)

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

<IfVersion >= 2.4>
    # Require ...
</IfVersion>
<IfVersion < 2.4>
    # Order ...
    # Deny ...
    # Allow ...
</IfVersion>

答案 2 :(得分:2)

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

然而,Apache .conf文件允许<IfDefine>,您可以在运行时使用“-D”指定:{/ p>

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

答案 3 :(得分:1)

您可以通过使用mod_rewrite作为访问控制来绕过需要知道:

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.(long|list|file|types)$
RewriteRule .* - [F,L]

答案 4 :(得分:1)

我遇到了这个问题,因为FallbackResource不在早期版本的Apache中,而且一旦聪明的托管公司拥有带有FallbackResource的Apache版本,它们就会删除mod_rewrite。当我想放置适合其环境的库代码时,我使用以下.htaccess:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteRule ^ - [E=protossl]
    RewriteCond %{HTTPS} on
    RewriteRule ^ - [E=protossl:s]
    RewriteRule "(^|/)\." - [F]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !=/favicon.ico
    RewriteRule ^ index.php [L]
</IfModule>

<IfModule !mod_rewrite.c>
    FallbackResource index.php
</IfModule>

现在当然有一些Apache版本/设置会失败 - 但如果mod_rewrite存在,请使用它,如果没有,希望FallbackResource存在。