2012-05-22 25 views
19

tl; dr: yapayım nasıl .conf veya .htaccess dosyasında aşağıdaki:Apache yapılandırmasında Apache sürümünü algıla?

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

Uzun soru: Apache 2.4 ile

eski Order olsun en lehine önerilmemektedir Require. Benim .htaccess dosyalarında

Ben Apaçi ben access_compat etkinleştirmek sürece başlamak için başarısız demektir

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

var. Bunu yaparken yararlı bir çözüm sunarken, yapılandırma çok sayıda sunucuya dağıtılacağı için her iki sözdizimi ile çalışan bir çözüm istiyorum. Soru şu ki, Apache'nin şu anki sürümünü nasıl algılayabileceğim ve doğru yönergeyi nasıl uygulayabileceğim.

Dosyayı çok sayıda kişi tarafından dağıtılan ve kullanılan bir çerçeve için kullanmayı düşünmekteyim ve belirli bir sunucu kurulumuna sahip olduklarını ya da eksik olduklarını kontrol edemedim/garanti edemem. Dosya 2.2/2.4 "agnostik" olacaktır.

cevap

2

Apache'nin farklı sürümlerini aynı ana bilgisayarda çalıştırabilirsiniz. S: Ayrı dizinlerdeki ayrı yapılandırma dosyalarında ne var? Dürüst

Yine

, Apache .conf dosyaları "-D" ile zamanında belirtebilirsiniz bir <IfDefine>, izin ... muhtemelen en temiz yaklaşım olduğuna inanıyorum:

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

+1

+1. Yine de bana yardım etmiyor. Web sunucusunun iki versiyonunu çalıştırmak, basit bir if/else çözebildiği zaman, _a lot_ işine benziyor. "Ayrı dizinleri" biraz daha genişletebilir misin? Mevcut sürümü kontrol etmek benim için çok güzel bir çözüm gibi görünüyor. Soruyu neden biraz genişletti. – Letharion

27

Bir kesmek ben kullanmış. Eğer mod_version yüklü varsayarsak aşağıdakileri yapabilirsiniz (birçok dağılımları varsayılan olarak gemi)

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

... ya da bu modül her iki uçta mevcut değilse, ancak yerel/sahne sunucunuz kazanır (ve Apache 2.x) ve canlı linux (ve Apache 2.y) ise, başka bir modül farkını kontrol edin, örn. '' –

+0

harika cevap. Her şey 2.4 için inşa edilmiş gibi görünüyor, ama benimki 2.2, ileriye dönük uyum sağlar! – Keith

1

Sen erişim denetimi için mod_rewrite kullanarak bilmek gereğini atlatabilir

<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

Bu yanıtı öneriyorum. Ekstra bağımlılığı karşılayabiliyorsanız, bu yaklaşım çok daha nettir. Ayrıca, mod_authz_core, kabul edilen cevapta yaklaşımı kullanırken hiçbir zaman devre dışı bırakılırsa, yapılandırma dosyası, 2.2 üzerinde çalıştığını ve bağımsız olarak devam edeceğini varsayar. Burada mod_version'ın kaldırılması, sunucunun başlatmayı reddedeceği anlamına gelir. – seanhodges

1

Bu sorunla karşılaştım çünkü FallbackResource Apache'nin önceki sürümlerinde bulunmuyor ve sık sık barındırma şirketlerinin mod_rewrite'i bir kez A sürümüne sahip olduktan sonra kaldırıyor FallbackResource ile pache. ama mod_rewrite varsa, onu kullanın ve -

<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> 

Şimdi tabii orada Bu başarısız bazı Apache versiyonları/kurulumları şunlardır: Ben onun çevreye adapte kütüphane kod yukarı koymak istediğinizde aşağıdaki .htaccess kullanmak eğer değilse, FallbackResource'ın orada olduğunu umarım. IfDefine ve -D seçeneği için