2012-05-22 3 views
19

TL; DR:古いOrder取得者のために廃止ApacheのバージョンをApacheの設定で検出しますか?

のApache 2.4の場合:

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

長い質問:どのように私は.confのか、.htaccessファイルに次のように行うのですかRequire。私の.htaccessファイルで

は、私は、Apacheは私がaccess_compatを有効にしない限り、起動に失敗した意味

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

を持っています。これを行うと便利な回避策が得られますが、私は構成が多くのサーバーに配布されるため、両方の構文で動作するソリューションが必要です。問題は、現在のバージョンのApacheを検出し、正しい指令を適用する方法です。

多くの人に配布され使用されているフレームワークにこのファイルを使用する予定で、特定のサーバー設定があるかどうかを制御することはできません。ファイルは2.2/2.4 "不可知論者"になります。

答えて

2

異なるバージョンのApacheを同じホスト上で実行できます。 Q:別々のディレクトリにある別々の設定ファイルで何が問題になりますか?

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

+1

IfDefineおよび-Dオプションの場合+1。それは本当に私を助けません。 Webサーバーの2つのバージョンを実行すると、単純なif/elseが解決できるはずの作業の_a lot_のように見えます。あなたは "別のディレクトリ"をもう少し拡張できますか?現在のバージョンを確認することは私にとって非常に素晴らしい解決策のようです。理由について少し質問を拡大しました。 – Letharion

27

Iハック:私は正直にApacheの.confファイルは、あなたが "-D" で、実行時に指定することができ<IfDefine>を、許可し、それにもかかわらず...それはおそらく最もクリーンなアプローチだ

を信じます使った事のある。あなたはmod_versionインストールされていると仮定すると、あなたは次の操作を行うことができます(多くのディストリビューションをデフォルトでそれを出荷)

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

...またはそのモジュールが両端になく、ローカル/ステージサーバーが勝ち(Apache 2.x)、ライブがlinux(およびApache 2.y)である場合は、他のモジュールの違い、つまり'' –

+0

素晴らしい答えです。すべてが2.4のために構築されているようですが、私の2.2は、これは前方互換性が可能です! – Keith

1

あなたは、アクセス制御のためのmod_rewriteを使用することによって知る必要を回避することができ

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

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

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

私はこの回答をお勧めします。あなたが余分な依存を余裕があれば、このアプローチははるかに明確です。また、mod_authz_coreが受け入れられた回答の方法を使用する際に無効になっている場合、設定ファイルは2.2で動作しているとみなし、関係なく処理を続行します。ここでmod_versionを削除すると、単にサーバが起動を拒否することになります。 – seanhodges

1

FallbackResourceはApacheの初期バージョンではないので、この問題に遭遇し、しばしば巧妙なホスティング企業がmod_rewriteを削除するとAバージョンFallbackResourceを持つpache。しかし、mod_rewriteのがある場合は、それを使用して -

<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のバージョン/セットアップは、次のとおりです。私はその環境に適応し、ライブラリのコードを上に配置するとき、私は、次の.htaccessを使用しますもしそうでなければ、FallbackResourceがそこにあることを願ってください。