2012-05-22 17 views
19

tl; dr: W jaki sposób wykonać następujące czynności w .conf lub pliku .htaccess:Wykryj wersję Apache w konfiguracji apache?

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

Longer pytanie:

z Apache 2.4 stary Order get zastąpiona Require.

W moich plikach .htaccess mam

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

co oznacza Apache nie uruchamia się chyba włączyć access_compat. Robiąc to przedstawia użyteczne obejście, potrzebuję rozwiązania, które będzie działać z obu składni, ponieważ konfiguracja będzie rozprowadzana na wiele serwerów. Pytanie brzmi, jak mogę wykryć obecną wersję Apache i zastosować poprawną dyrektywę.

Mam zamiar użyć tego pliku do frameworka, który jest rozprowadzany i używany przez wiele osób, i nie mogę kontrolować/gwarantować, że ma on lub brakuje jakiejś konkretnej konfiguracji serwera, dlatego chciałbym plik ma być agnostyczny 2,2/2,4 ".

Odpowiedz

2

Możesz uruchomić różne wersje Apache na tym samym hoście. P: Co jest nie tak z oddzielnymi plikami konfiguracyjnymi w oddzielnych katalogach? Szczerze wierzę, że to prawdopodobnie najczystsze podejście ...

Niemniej pliki Apache .conf umożliwić <IfDefine>, które można określić przy starcie z „-d”:

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

+1

+1 dla opcji IfDefine i -D. Tak naprawdę to mi nie pomaga. Uruchomienie dwóch wersji serwera sieciowego wydaje się być dużo pracy, gdy prosty/else powinien być w stanie go rozwiązać. Czy możesz rozwinąć "oddzielne katalogi" nieco więcej? Sprawdzenie obecnej wersji wydaje mi się bardzo dobrym rozwiązaniem. Rozszerzyłem nieco pytanie na temat tego, dlaczego. – Letharion

27

hack że użył.

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

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

... lub jeśli ten moduł jest nieobecny na obu końcach, ale twój serwer lokalny/etapowy wygrywa (i Apache 2.x), a twój live jest linuxem (i Apache 2.y), sprawdź pod kątem jakiejkolwiek innej różnicy modułów, tj. '' –

+0

fantastyczna odpowiedź. Wszystko wydaje się budować dla wersji 2.4, ale moja wynosi 2,2, co pozwala na kompatybilność w przyszłości! – Keith

1

Można ominąć potrzebę poznania za pomocą mod_rewrite do kontroli dostępu:

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

Zakładając masz mod_version zainstalowany (wiele dystrybucji wysłać go domyślnie) można wykonać następujące czynności:

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

Polecam tę odpowiedź. Jeśli możesz pozwolić sobie na dodatkową zależność, to podejście jest o wiele jaśniejsze. Ponadto, jeśli mod_authz_core jest kiedykolwiek wyłączony podczas korzystania z podejścia w zaakceptowanej odpowiedzi, to plik konfiguracyjny zakłada, że ​​działa on w wersji 2.2 i kontynuuje niezależnie. Usunięcie tutaj mod_version będzie oznaczać, że serwer odmówi uruchomienia. – seanhodges

1

Wpadłem na ten problem, ponieważ FallbackResource nie jest we wczesnych wersjach Apache i często sprytne firmy hostingowe usuwają mod_rewrite, gdy już mają wersję A pache z FallbackResource. Używam następujący .htaccess gdy chcę umieścić kod biblioteki up, który dostosowuje się do swojego środowiska:

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

Teraz oczywiście istnieją pewne Apache/Wersje konfiguracje gdzie to zawiedzie - ale czy mod_rewrite jest tam, użyj go i jeśli nie, miej nadzieję, że FallbackResource tam jest.