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“不可知”。
答案 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>
答案 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存在。