O look-ahead negativo do Regex não está funcionando para o mod_rewrite entre diferentes versões do Apache

5

Eu tenho uma linha mod_rewrite que funciona no Apache 2.2, mas não no Apache 1.3:

RewriteRule     ^(?!index.php)(?!skin/)(?!js/)(.+)      /index.php?file=$1              [NC,L]

Se eu perder os componentes de look-ahead negativos entre os colchetes, perco o código de status 500. O GoDaddy não atualiza o httpd para o pacote deste cliente (suspiro), então alguém tem uma solução que funcione em 1.3 (e também não é muito confusa: P)? Ou melhor ainda alguém pode explicar o que pode estar acontecendo aqui? Eu continuo curioso apenas porque não consigo encontrar nenhuma informação sobre o mecanismo de regex Perl usado em 1.3 não suportando a antecipação negativa ...

    
por tjbp 10.03.2010 / 02:26

2 respostas

6

O Apache 1.3 não usa expresso regulares compatíveis com Perl (PCRE), ele usa regexes POSIX. Regexes POSIX não suportam a visão negativa. O suporte PCRE é um novo recurso que começa no Apache 2.

Quanto a como fazer isso funcionar, você provavelmente precisará usar alguns RewriteCond para que a regra NÃO seja acionada se corresponder a um desses três ... talvez:

RewriteCond   %{REQUEST_URI}   !index.php.*
RewriteCond   %{REQUEST_URI}   !skin/.*
RewriteCond   %{REQUEST_URI}   !js/.*
RewriteRule   ^(?!index.php)(?!skin/)(?!js/)(.+)  /index.php?file=$1    [NC,L]

Claro, eu não testei isso ... Eu não tenho mais nenhum Apache 1.3.

    
por 10.03.2010 / 04:25
1

Adam Bellaire está certo. O Apache mudou o mecanismo de expressão regular com a versão 1.2 e com a versão 2.0.

Para o Apache 1.1.x eles usaram “ System V8 ” e, como o Apache 1.2 e mais tarde, era POSIX ERE . A última mudança foi com o Apache 2.0 quando eles mudaram para PCRE . Você pode dar uma olhada na Comparação de sabor de expressão regular para ver as diferenças.

Veja agora uma solução de como você pode resolver isso sem asserções antecipadas disponíveis apenas no PCRE:

RewriteCond $1 !^(index\.php|skin/|js/)
RewriteRule ^(.+) /index.php?file=$1 [NC,L]

Aqui, o RewriteCond adicional é para verificar se a string correspondente do primeiro subpadrão começa com as opções listadas.

    
por 21.10.2010 / 15:42