2012-10-14 17 views
13

Wiem, że podobne pytania zadawano wcześniej, ale nie znalazłem żadnych konkretnych odpowiedzi w mojej sytuacji..htaccess w wielu środowiskach

Mam witryny ExpressionEngine działa na wielu środowiskach (lokalnym, dev, produkcja), a każdy z tych środowisk potrzebuje różne zasady .htaccess:

wszystkich środowiskach

Development

  • Ochrona hasłem z .htpasswd protokołu
  • Siła HTTPS
  • Prevent indeksowanie wyszukiwarki internetowej z X-Robots-Tag

Produkcji

  • protokół HTTPS Siła
  • przekierowania subdomeny bez www na www

lokalne

  • Brak unikalne przepisy.

Widziałem wiele przykładów, jak ustawić określone środowiska na moduł. Podobnie jak RewriteCond %{REQUEST_HOST} ^dev.myurl.com dla modułu mod_rewrite i tricks like this dla wymagań .htpasswd.

Ale wolałbym, w jaki sposób ustawić globalne zmienne środowiskowe, a następnie ponownie użyć tych zmiennych w pliku .htaccess dla środowiska. Aby użyć pseudo-skrypt jako przykład coś takiego:

var local = 'mysite.local'; 
var development = 'dev.mysite.com'; 
var production = 'www.mysite.com'; 

// Global .htaccess rules 

if(environment == local){ 
    // Local environment .htaccess rules 
} 

if(environment == development){ 
    // Development environment .htaccess rules 
} 

if(environment == production){ 
    //Production envirotnment .htaccess rules 
} 

ten sposób wszystkie wszystkie zasady specyficzne dla środowiska są zgrupowane razem, tworząc naprawdę czysty plik, a tylko jedna zmienna musi być zmieniony, jeżeli środowisko jest zmieniony.

Widziałem kilka odniesień do zmiany ustawień w plikach konfiguracyjnych Apache, ale oczywiście nie jest to realną opcją, jeśli mam do czynienia z hostami innych firm.

A więc czy to życzeniowe myślenie w stylu "kule w niebie", czy może to zrobić?

+0

natknąłem [artykuł ten] (http://www.thenerdary.net/post/20965499862/htaccess-environments), których jeszcze nie próbowałem, ale wygląda obiecująco. – kgrote

Odpowiedz

8

Czy to życzeniowe myślenie o kształcie "kule w niebie", czy może to zrobić?

IMO, tak. Nigdy nie będziesz w stanie uzyskać przewidywalnego "zakresu" reguł opartych na zmiennych ENV lub czegoś podobnego.Nie ma arbitralnego if(something) { do everything in here } w apache. Wiele dyrektyw nie zadziała w pewnych zakresach, a później, kiedy trzeba będzie zmienić sposób działania, z większym prawdopodobieństwem złamie się to, co masz, niż po prostu zmienisz.

Najlepszym sposobem jest not use htaccess files at all:

Należy unikać korzystania z plików .htaccess całkowicie, jeśli masz dostęp do serwera httpd główny plik konfiguracyjny. Używanie plików .htaccess spowalnia twój serwer http Apache. Każda dyrektywa, którą można zawrzeć w pliku .htaccess, jest lepiej ustawiona w bloku Directory, ponieważ będzie miała ten sam efekt przy lepszej wydajności.

Utwórz osobny vhost dla lokalnego, deweloperskiego i produkcyjnego. Włącz je lub wyłącz w razie potrzeby, niezależnie od konfiguracji globalnej, którą udostępniają, przechowuj w innym miejscu (na przykład w pliku o nazwie global.includes), a następnie użyj dyrektywy Include we wszystkich 3 vhostach. Jeśli chcesz zastosować reguły do ​​określonych katalogów, użyj bloku <Directory> zamiast plików htaccess.

Jeśli wolisz trzymać wszystko wewnątrz plików htaccess, ty mógłby spróbuj umieścić wszystko in <IfDefine> blocks, to chyba najbliższa rzecz musisz swoim pseudo-kod w swoim pytaniu. Zasadniczo coś takiego:

# Global htaccess rules 
RewriteEngine On 
RewriteRule ^foo$ /bar [L] 

# Only local 
<IfDefine LocalInstance> 
    RewriteRule ^local/foo /bar [L] 
</IfDefine> 

# Only dev 
<IfDefine DevInstance> 
    RewriteRule ^dev/foo /bar [L] 
</IfDefine> 

# Only production 
<IfDefine ProductionInstance> 
    RewriteRule ^dev/foo /bar [L] 
</IfDefine> 

Następnie po uruchomieniu apache, to że trzeba przekazać w -DLocalInstance, -DDevInstance lub -DProductionInstance jako paramaeters linii poleceń lub za pomocą dyrektywy Define (z tylko jednym argumentem) gdzieś w vhost config . Nie gwarantuje to, że działa tak gładko, jak to powinno wyglądać, natknąłem się wcześniej na niewyjaśnione problemy z <IfDefine>, szczególnie jeśli starasz się zbytnio podkręcić.

+2

W Apache HTTP Server v2.4 jednym z podstawowych ulepszeń jest: ', i sekcje mogą być używane do ustawienia konfiguracji w oparciu o kryteria" na żądanie ". Tak długo, jak to, co chcesz użyć obsługuje kontekst katalogu. http://httpd.apache.org/docs/trunk/mod/core.html#if –

10

Odpowiedź Jona jest dobra. Niestety nie wszystkie hosty internetowe pozwalają kontrolować ten parametr -D, aby uruchomić Apache.

Oto sposób na wykorzystanie pojedynczego pliku .htaccess na dev i produkcji, ale mają tylko chroniony hasłem witryny dev:

# ---------------------------------------------------------------------- 
# Password protect staging server 
# Use one .htaccess file across multiple environments 
# (e.g. local, dev, staging, production) 
# but only password protect a specific environment. 
# ---------------------------------------------------------------------- 

SetEnvIf Host staging.domain.com passreq 
AuthType Basic 
AuthName "Password Required" 
AuthUserFile /full/path/to/.htpasswd 
Require valid-user 
Order allow,deny 
Allow from all 
Deny from env=passreq 
Satisfy any