Multiple RewriteRules per singolo RewriteCond in .htaccess

Ho il seguente comando nel mio .htaccess

RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC] RewriteRule ^(.*?)-([az]+) %2/$1.$2 [L] RewriteRule ^(.*?)-([0-9]+)([az]) %2/$1$3.$2 [L] 

% 2 non funziona nelle righe seconda e successiva. Posso definire qualsiasi variabile per% 2 e usarla in tutti i comandi RewriteRule? Il seguente comando funziona

  RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC] RewriteRule ^(.*?)-([az]+) %2/$1.$2 [L] RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC] RewriteRule ^(.*?)-([0-9]+)([az]) %2/$1$3.$2 [L] 

Ma voglio usare% 2 per più regole senza duplicare le condizioni.

Puoi usare il flag RewriteRule S|skip per bind multipli RewriteRules su un singolo RewriteCond (o su un set di RewriteConds). Ecco un esempio che applica una regola Cond a tre:

 RewriteCond %{HTTP_HOST} !^www.mydomain.com$ # skip rules if NOT within domain - only way to tie multiple rules to one cond RewriteRule .? - [S=3] RewriteRule ^path1(/.*)$ /otherpath1$1 RewriteRule ^path2(/.*)$ /otherpath2$1 RewriteRule ^path3(/.*)$ /otherpath3$1 

Per modificare una Cond esistente per lavorare con più regole devi:

  • Annulla la condizione (anteponala!)
  • Se hai più RewriteConds:
    Cambia gli AND logici nei Conds in OR e viceversa.
  • Aggiungi una regola di riscrittura saltata di fronte a tutte le regole che vuoi colbind alle condizioni. Impostare il parametro S sul numero di righe della regola da saltare.

Si prega di essere consapevoli che non è ansible utilizzare alcun back-referral che faccia riferimento a RewriteCond (come% 1) nelle regole saltate. Questi sono accessibili solo nella RewriteRule di salto.

La variabile deve essere salvata come var di Apache, quindi può essere utilizzata senza condizioni ripetute.

Il salvataggio in variabili Apache è mostrato in seconda linea. Utilizzo di vars salvati in 3a e 4a linea.

 RewriteCond %{HTTP_HOST} ^(www\.)?([a-z0-9-]+)\.example\.com [NC] RewriteRule .? - [E=Wa:%1,E=Wb:%2] RewriteRule ^(.*?)-([az]+) %{ENV:Wb}/$1.%{ENV:Wb} [L] RewriteRule ^(.*?)-([0-9]+)([az]) %{ENV:Wb}/$1$3.$2 [L] 

Chiaramente, questo non è molto divertente, specialmente quando le cose crescono e diventano più complesse. Tuttavia, esiste un’opzione meno conosciuta dell’istruzione RewriteRule, che dice ad apache di saltare il successivo numero N di istruzione RewriteRule. [S = N]. Quindi, invece di controllare ogni volta se la richiesta NON è un file E NON è una directory, potremmo fare questo: Blocco di codice

 # RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule .* - [S=3] RewriteRule ^([^./]+)/$ http://www.santweb.co.uk/$1 [L] RewriteRule ^([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2 [L] RewriteRule ^([^./]+)/([^./]+)/([^./]+)/$ http://www.santweb.co.uk/$1/$2/$3 [L] 

#

Ho trovato questo, da: http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess/

Penso che sia utile

In genere, non è ansible utilizzare più istruzioni RewriteRule in seguito a un singolo RewriteCond. Ma puoi fare un piccolo trucco per le tue condizioni, se vuoi, come si vede in:

https://serverfault.com/questions/162586/one-rewritecond-for-multiple-rewriterules
o
http://www.sant-media.co.uk/2010/03/applying-rewritecond-to-multiple-rewriterule-in-htaccess/