Voce deve usar a diretiva RewriteCond para adicionar condições para aplicar ou não o redirecionamento.
Por exemplo:
# Redirect when we have a single parameterRewriteCond %{SCRIPT_FILENAME} !-f RewriteCond %{SCRIPT_FILENAME} !-dRewriteRule ^([a-zA-Z0-9_-]+)/$ index.php?mod=$1
Neste caso, as flags !-f e !-d estão determinando que o redirect só ocorrera se não existir arquivo ou pasta com a url correspondente.
A sintaxe do comando é:
RewriteCond TestString CondPattern
Onde CondPattern é uma REGEXP compatível com perl, com alguns acréscimos.
Voce pode prefixar o pattern com ! para inverter seu efeito. Há algumas variações que permitem usar o CondPattern sem REGEXP também:
'<CondPattern''>CondPattern''=CondPattern'
Essas últimas três tratam a CondPattern literalmente como string, e comparam respectivamente a TestString com o valor literal da CondPattern
Veja mais algumas condições:
-dPega o o resultado daTestStringe verifica se é um diretório existente-fPega o o resultado daTestStringe verifica se é um arquivo existente-sFaz o mesmo que o-f, mas só considera arquivos não-vazios-lVerifica se o resultado daTestStringé caminho para um link simbólico-xVerifica se o resultado daTestStringé um caminho com permissão +x-FEquivale ao-f, mas faz um teste pra ver se o arquivo é realmente acessível pelo Apache. Isso implica em fazer uma requisição interna extra no teste, cuidado com uso em excesso.-UMesmo que o-F, mas testa por URL e não Path
Todos estes testes podem ser negados com uma ! no início.
Tanto para o RewriteCond quanto para o RewriteRule, há algumas variáveis pré-populadas que podem ser usadas delimitadas com %{ }. Veja algumas das mais comuns:
-
REMOTE_ADDRé o IP dohostremoto -
REQUEST_FILENAMEé o caminho completo do arquivo que atende ao request original, tomando por base o filesystem da máquina, e não relativo à hospedagem. Cuidado: caso seja usado em VirtualHost, tem o mesmo efeito que oREQUEST_URI. -
REQUEST_SCHEMEretorna usualmentehttpouhttps, dependendo da conexão. -
REQUEST_URIé uma das variáveis mais usadas. É a que tem o caminho da requisição, como por exemploindex.html. Ela não inclui a query. Tudo que vem da?em diante é retornado em QUERY_STRING. -
THE_REQUESTé a linha completa do request, como por exemploGET /index.html HTTP/1.1. Não inclui os headers e nao é "escapada", diferentemente das outras variáveis.
RewriteRule
A diretiva RewriteRule faz a reescrita do URL, e se ocorrer mais de uma vez, é aplicada na ordem sequencial do arquivo.
RewriteRule Pattern Substitution [flags]
Pattern é basicamenteis uma RegEx compatível com Perl. Na primeira ocorrência, é aplicada a RegEx ao URL depois de decodificado (%). Os seguintes RegExes são aplicados à saida do Rewrite anterior.
Substitution é uma string que pode ser mesclada com resultados (grupos) extraídos da RegEx, e também variáveis delimitada por %{ } conforme exemplificado acima.
Flags
Seguem algumas das flags mais comuns:
-
Lconsidera este sendo o último Rewrite, não aplicando mais nenhuma regra que modifique o URL -
R=codefaz um redirect com o código indicado (ex: 301, 302) -
NC(No-case) faz comparações ignorando maiúsculas e minúsculas -
Nrefaz a cadeia de modificações, começando pela primeira novamente -
QSA(query string append) depois das modificações feitas, aplica a query string original ao final da linha (em outras palavras, preserva o que tinha depois da ? no URI original) -
COseta um cookie no formatoCO=NAME:VAL:domain[:lifetime[:path[:secure[:httponly]]]]
A descrição completa das flags se encontra na documentação.
RewriteCond %{HTTP_HOST} ^www.(([a-z0-9_]+.)?exemplo.com.br)$ [NC] RewriteRule .? http://%1%{REQUEST_URI} [R=301,L,QSA]
No exemplo acima estamos verificando se o domínio está com www, e removendo o mesmo na linha seguinte, mantendo o resto do URL.
A flag R=301 determina que seja um redirect permanente, e o L indica que é a última operação desta cadeia. NC indica que a comparação ignorará maiúsculas e minúsculas, e o QSA fará com que se houver query string (?nome=valor&...), esta seja conservada no redirect.
Descrevendo o exemplo posto na pergunta
-
RewriteEngine On
Ativa o módulo Rewrite, que faz a reescrita de URL. -
RewriteCond %{REQUEST_FILENAME} !-f
Determina que o rewrite só se aplicará se nao (!) existir um arquivo (-f) com aquele nome -
RewriteCond %{REQUEST_FILENAME} !-d
Determina que o rewrite só se aplicará se nao (!) existir um diretório (-d) com aquele nome -
RewriteRule ^(.*)$ index.php?params=$1 [NC]
Redireciona o usuário para index.php?params=$1 para qualquer URL entrado.
Aqui, o $1 é o 1º grupo da RegEx, determinado pelos( )s na captura.
O NC neste caso não serve para nada, nem precisaria estar no Rewrite.