【问题标题】:Detect Apache version in apache config?在 apache 配置中检测 Apache 版本?
【发布时间】:2012-05-29 05:57:36
【问题描述】:

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

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

更长的问题:

在 Apache 2.4 中,旧的 Order 已被弃用,取而代之的是 Require

在我的 .htaccess 文件中

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

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

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

【问题讨论】:

    标签: apache .htaccess


    【解决方案1】:

    我用过的一个hack。

    # Apache 2.2
    <IfModule !mod_authz_core.c>
        Satisfy Any
    </IfModule>
    
    # Apache 2.4
    <IfModule mod_authz_core.c>
        Require all granted
    </IfModule>
    

    【讨论】:

    • ...或者如果两端都没有该模块,但您的本地/舞台服务器是 win(和 Apache 2.x)并且您的 live 是 linux(和 Apache 2.y),请检查对于任何其他模块差异,即&lt;IfModule !mod_win32.c&gt;
    • 很棒的答案。一切似乎都是为 2.4 构建的,但我的是 2.2,这允许向前兼容!
    【解决方案2】:

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

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

    【讨论】:

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

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

    尽管如此,Apache .conf 文件允许&lt;IfDefine&gt;,您可以在运行时使用“-D”指定它:

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

    【讨论】:

    • +1 表示 IfDefine 和 -D 选项。但它并没有真正帮助我。当一个简单的 if/else 应该能够解决它时,运行两个版本的网络服务器似乎是很多的工作。你能再扩展一下“单独的目录”吗?检查当前版本对我来说似乎是一个非常好的解决方案。将问题扩大了一点。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      我遇到了这个问题,因为 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 存在。

      【讨论】:

        猜你喜欢
        • 2013-10-19
        • 2014-06-04
        • 2018-10-06
        • 1970-01-01
        • 2011-03-14
        • 2019-08-29
        • 2017-02-24
        • 2021-09-29
        • 1970-01-01
        相关资源
        最近更新 更多