23

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>

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

我打算将该文件用于分发给很多人并被很多人使用的框架,并且我无法控制/保证他们拥有或缺少任何特定的服务器设置,这就是我希望该文件的原因2.2/2.4“不可知论”。

4

5 回答 5

31

A hack that I have used.

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

# Apache 2.4
<IfModule mod_authz_core.c>
    Require all granted
</IfModule>
于 2013-02-26T05:09:57.983 回答
20

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

<IfVersion >= 2.4>
    # Require ...
</IfVersion>
<IfVersion < 2.4>
    # Order ...
    # Deny ...
    # Allow ...
</IfVersion>
于 2013-11-22T01:14:59.307 回答
2

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

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

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

于 2012-05-22T17:47:27.910 回答
1

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

RewriteEngine On
RewriteCond %{REQUEST_URI} !\.(long|list|file|types)$
RewriteRule .* - [F,L]
于 2013-11-22T01:00:45.577 回答
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 存在。

于 2016-08-27T13:45:45.867 回答