15

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:.% N backreference all'interno di RewriteCond

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

Ma, voglio che questo per lavorare con qualsiasi cosa ho messo in Tuttavia, ho bisogno del %{REQUEST_URI} controllato contro il testo trovato come il dominio. Ho provato ad 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 linea RewriteCond %{REQUEST_URI} !^/%3/ fa sì che il mio codice a causa di 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.

risposta

38

Ci sono 2 cose che stai facendo male qui.

In primo luogo, l'espressione regolare non va bene. È necessario sfuggire ai punti . altrimenti verranno trattati come "qualsiasi carattere che non è una nuova riga". Ciò essenzialmente rende il riferimento %3 l'ultimo carattere del nome host prima del TLD (ad esempio http://blah.bar.loc, % 3 = r).

In secondo luogo, non è possibile utilizzare le ritrasmissioni nella regex di un RewriteCond, solo la stringa sul lato sinistro, è una specie di limitazione strana. Tuttavia, è possibile utilizzare i riferimenti \1 nella regex in modo da poter costruire una stringa sul lato sinistro intelligente da abbinare. Qualcosa come %3::%{REQUEST_URI} e quindi è possibile abbinare così: !^(.*?)::/\1/?. Questa espressione regolare dice in sostanza: "match e di gruppo il primo blocco di testo prima il ::, quindi assicurarsi che il blocco di testo seguendo le :: inizia con /(first block)".

Quindi le regole dovrebbe 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] 
+0

Cheers! Non ho idea di cosa diavolo sia quella linea, ma funziona. Per ora, sono contento di questo. Il tuo aiuto è molto apprezzato :) –

+1

Dove sulla terra è questo documentato. Questa risposta merita molti più voti positivi. Io voto che non accettiamo la risposta, mettiamo la taglia e reagiamo. –

+0

Molto intelligente! Grazie =) – gobwas