2008-12-05 11 views
18

Il titolo dice quasi tutto. :-) Ho molti host virtuali e voglio mettere un singolo blocco di riscrittura nella parte superiore del file httpd.conf che riscrive gli URL indipendentemente dall'host virtuale a cui la richiesta può essere indirizzata. Come diavolo faccio questo?Come posso implementare una RewriteCond/RewriteRule globale in Apache che si applica a tutti gli host virtuali?

Ho trovato this ma la mia domanda è la stessa: come posso fare questo senza ricorrere ai file .htaccess ed eseguire qualche altra azione per ogni host virtuale?

OMGTIA!

+0

Holy crap. Ho bloccato tutti. – hourback

+0

Quindi sembra che tu abbia. – UnkwnTech

risposta

9

Specificare RewriteOptions InheritDown nell'ambito genitore (come httpd. conf) per applicare le regole agli host virtuali secondari senza modificarli.

Questo funziona solo su host virtuali in cui la direttiva RewriteEngine è impostato su on:

noti che riscrivono le configurazioni non vengono ereditate dalle host virtuali. Ciò significa che è necessario disporre di un RewriteEngine sulla direttiva per ogni host virtuale in cui si desidera utilizzare le regole di riscrittura.

(source)

Apache supporta questo dato 2.4.8 (non disponibile al momento della domanda iniziale).

Dalla documentazione per RewriteOptions:

InheritDown

Se questa opzione è abilitata, tutte le configurazioni figli erediteranno la configurazione della configurazione corrente. È equivalente a specificare RewriteOptions Eredita in tutte le configurazioni figlio. Vedi l'opzione Eredita per maggiori dettagli su come vengono gestite le relazioni genitore-figlio. Disponibile in Apache HTTP Server 2.4.8 e versioni successive.

InheritDownBefore

Come InheritDown sopra, ma le regole dall'ambito corrente vengono applicate prima delle regole specificate nel campo di applicazione di ogni bambino. Disponibile in Apache HTTP Server 2.4.8 e versioni successive.

IgnoreInherit

Questa opzione forza le configurazioni attuali e figlio di ignorare tutte le regole che sarebbero ereditati da un genitore che specifica InheritDown o InheritDownBefore. Disponibile in Apache HTTP Server 2.4.8 e versioni successive.

(http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewriteoptions)

+0

Si noti che questo richiede ancora l'opzione 'RewriteEngine On' nella sezione Host virtuale. – brocksamson

+1

"Nota che le configurazioni di riscrittura non sono ereditate dagli host virtuali. Ciò significa che devi avere un RewriteEngine sulla direttiva per ogni host virtuale in cui desideri utilizzare le regole di riscrittura." https://httpd.apache.org/docs/2.4/mod/mod_rewrite.html –

5

Non l'ho mai testato, quindi potrebbe non funzionare, ma proverei ad aggiungere una direttiva include in tutti i blocchi host virtuali a un singolo file. Dovresti cambiare ogni blocco di configurazione di un host virtuale una volta, ma dopo, dovresti avere un posto centrale da cui apportare modifiche. YMMV.

+0

La migliore risposta per me :) poiché non è limitato a mod_rewrite, ma funziona con qualsiasi funzione/direttiva di Apache. – CedX

9

si presenta come la soluzione più semplice possibile è aggiungere

RewriteOptions inherit 

ad ogni direttiva VirtualHost. Questo è almeno molto più semplice che fare casino con i file .htaccess. Apache è abbastanza chiaro sul fatto che

per impostazione predefinita, le configurazioni di riscrittura sono non ereditate. Ciò significa che è necessario che abbia un RewriteEngine sulla direttiva per ciascun host virtuale in che si desidera utilizzare. (http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html)

e apparentemente il modo per modificare il valore predefinito è via RewriteOptions nel bambino (vhost o direttore), quindi bisogna fare qualcosa in ogni bambino.

+2

Poiché Apache 2.4.8 è possibile utilizzare httpd.conf (o altri) con 'RewriteOptions InheritDown', equivale a specificare' RewriteOptions Inherit' in tutti i vhost. –

+0

@MatejSnoha, vuoi inviare il tuo commento come soluzione alla domanda? Potrebbe diventare più visibile agli altri in cerca di una soluzione a questo problema. Non sono nella posizione di testarlo da solo, ma sarei interessato a sapere se aiuta gli altri. – hourback

2

Se si sta solo tentando di riscrivere qualcosa nella parte del dominio del nome, ad es. per correggere un errore di ortografia comune, non è nemmeno necessario l'opzione 'eredita'. Ho configurato un host virtuale senza nome per catturare tutti i nomi host non validi e visualizzarli correttamente prima di reindirizzarli.

Poiché utilizza reindirizzamenti, l'host virtuale appropriato verrà trovato dopo l'applicazione delle riscritture.

Options +Indexes +FollowSymLinks 
RewriteEngine on 
# If it begins with only domain.com, prepend www and send to www.domain.com 
RewriteCond %{HTTP_HOST} ^domain [NC] 
RewriteRule ^(.*) http://www.domain.com$1 [L,R=301] 

# Correct misspelling in the domain name, applies to any VirtualHost in the domain 
# Requires a subdomain, i.e. (serviceXXX.)domain.com, or the prepended www. from above 
RewriteCond %{HTTP_HOST} ^([^.]+\.)dommmmmain\.com\.?(:[0-9]*)?$ [NC] 
RewriteRule ^(.*) %{HTTP_HOST}$1 [C] 
RewriteRule ^([^.]+\.)?domain.com(.*) http://$1domain.com$2 [L,R=301] 

# No-name virtual host to catch all invalid hostnames and mod_rewrite and redirect them 
<VirtualHost *> 
    RewriteEngine on 
    RewriteOptions inherit 
</VirtualHost> 
+0

Pensavo avessi detto che non avevi nemmeno bisogno dell'opzione "inherit", ma tu la includi nella tua regola huyz

+0

La usiamo per correggere l'ortografia del nostro nome di dominio.In tal caso, è sufficiente avere 'inherit' solo per il carattere jolly VirtualHost. Se si dispone di più opzioni di riscrittura più complesse, potrebbe essere necessario includere "inherit" in ogni VirtualHost. –

+0

Ah, quindi intendevi che non hai bisogno dell'opzione "inherit" in ogni virtualhost. Fatto. – huyz

0

Ho sempre usato un VHost "catch-all" per le direttive che volevo su tutta la linea, come ......

Listen 80 
NameVirtualHost *:80 

<VirtualHost *:80> 
ErrorLog "/var/log/apache2/error_log" 
</VirtualHost> 

<VirtualHost *:80> 
ServerName alloftherestoftheVHosts.com 
DocumentRoot "/ServiceData/......... 
............ 

Ed è sempre sembrato a lavorare. ... i log degli errori sono stati combinati correttamente, ecc ... ma è possibile che questo sia il risultato di una direttiva precedente/conflittuale/con la stessa mentalità.

Nota personale .. Chiunque sognato lo schema di configurazione di Apache e la sintassi è stato un dingbat, o un gruppo di dingbat, che ha trascorso troppo tempo nella loro caverna .... Il tutto deve essere esorcizzato e XMLized, o qualcosa! Anche se sono entrambi terribilmente diversa ... il processo di configurazione Ciao-Kitty di Cherokee .. al brutalmente succinta NGinx config .... sono entrambi ..

11

Per impostazione predefinita, le impostazioni in modo molto più logico di configurazione mod_rewrite dalla il contesto del server principale non è ereditato dagli host virtuali.Per rendere le impostazioni del server principali si applicano a host virtuali, è necessario inserire le seguenti direttive in ogni sezione <VirtualHost>:

RewriteEngine On 
RewriteOptions Inherit 

click http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html per trovare ulteriori informazioni

Problemi correlati