Backreference% N in RewriteCond

Sto lavorando su un sistema di dominio virtuale. Ho un DNS jolly impostato come *.loc , e sto cercando di lavorare sul mio file .htaccess . Il seguente codice funziona:

 RewriteEngine On RewriteCond %{HTTP_HOST} ^(www.)?example\.loc$ [NC] RewriteCond %{REQUEST_URI} !^/example/ RewriteRule (.*) /example/$1 [L,QSA] 

Ma, voglio che funzioni con tutto ciò che ho inserito. Tuttavia, ho bisogno che %{REQUEST_URI} confrontato con il testo trovato come dominio. Ho provato a utilizzare questo codice:

 RewriteEngine On RewriteCond %{HTTP_HOST} ^(www.)?([a-zA-Z0-9-]*.)?([a-zA-Z0-9-]+)\.loc$ [NC] RewriteCond %{REQUEST_URI} !^/%3/ RewriteRule (.*) /%3/$1 [L,QSA] 

Ma la riga RewriteCond %{REQUEST_URI} !^/%3/ causa il mio codice attraverso un errore interno del server. Capisco che questo è dovuto al% N nel mio codice, ma c’è un modo in cui posso lavorarci? Ho bisogno di questa linea, altrimenti il ​​mio codice non riesce da reindirizzamenti interni.

Spero che questo abbia senso per qualcuno. Tutto ciò di cui ho bisogno è di poter effettuare il backreference di un RewriteCond in un successivo RewriteCond.

Ci sono 2 cose che stai sbagliando qui.

Innanzitutto, la tua %{HTTP_HOST} non va bene. Devi sfuggire al . i punti altrimenti saranno trattati come “qualsiasi carattere che non è una nuova riga”. Ciò rende essenzialmente il riferimento a %3 dell’ultimo carattere del nome host prima del TLD (ad esempio http://blah.bar.loc 3 = r ).

In secondo luogo, non è ansible utilizzare le ritrasmissioni nella regex di un RewriteCond , solo la stringa sul lato sinistro, è una specie di limitazione strana. Tuttavia, puoi usare i riferimenti \1 , nella regex in modo da poter build una stringa sul lato sinistro intelligente da abbinare. Qualcosa come %3::%{REQUEST_URI} e quindi puoi trovare una corrispondenza come questa !^(.*?)::/\1/? . Questa regex dice essenzialmente: “confronta e raggruppa il primo blocco di testo prima di :: , quindi assicurati che il blocco di testo che segue :: inizi con /(first block) “.

Quindi le tue regole dovrebbero assomigliare a questo:

 RewriteEngine On RewriteCond %{HTTP_HOST} ^(www\.)?([a-zA-Z0-9-]*\.)?([a-zA-Z0-9-]+)\.loc$ [NC] RewriteCond %3::%{REQUEST_URI} !^(.*?)::/\1/? RewriteRule (.*) /%3/$1 [L,QSA]