Backreference% N dentro de RewriteCond

Eu estou trabalhando em um sistema de domínio virtual. Eu tenho um DNS curinga configurado como *.loc e estou tentando trabalhar no meu arquivo .htaccess . O código a seguir funciona:

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

Mas, quero que isso funcione com qualquer coisa que eu coloquei. No entanto, preciso que o %{REQUEST_URI} verificado em relação ao texto encontrado como o domínio. Eu tentei usar este código:

 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] 

Mas a linha RewriteCond %{REQUEST_URI} !^/%3/ faz o meu código através de um erro interno do servidor. Eu entendo isso é por causa do% N no meu código, mas há uma maneira que eu possa trabalhar com ele? Eu preciso desta linha, caso contrário meu código falha de redirecionamentos internos.

Espero que isso faça sentido para alguém. Tudo o que preciso é poder retroceder um RewriteCond em um RewriteCond a seguir.

Há duas coisas que você está fazendo errado aqui.

Primeiro, seu %{HTTP_HOST} regex não é bom. Você precisa escaping do . pontos, caso contrário, eles serão tratados como “qualquer caractere que não seja uma nova linha”. Isso essencialmente faz com que o %3 retroceda o último caractere do nome do host antes do TLD (por exemplo, http://blah.bar.loc 3 = r ).

Segundo, você não pode usar backreferences no regex de um RewriteCond , apenas a string do lado esquerdo, é uma espécie de limitação estranha. No entanto, você pode usar as referências \1 , no regex, para poder construir uma sequência do lado esquerdo inteligente para corresponder. Algo como %3::%{REQUEST_URI} e então você pode combinar assim !^(.*?)::/\1/? . Esta regex essencialmente diz: “combine e agrupe o primeiro bloco de texto antes do :: , então tenha certeza que o bloco de texto que segue o :: começa com /(first block) “.

Então suas regras devem ser assim:

 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]