Skip to content

Instantly share code, notes, and snippets.

@viniciusdaniel
Created May 4, 2017 17:39
Show Gist options
  • Save viniciusdaniel/84cfc9b29ec45c4fa498230d0bf1b478 to your computer and use it in GitHub Desktop.
Save viniciusdaniel/84cfc9b29ec45c4fa498230d0bf1b478 to your computer and use it in GitHub Desktop.

RewriteCond

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.

Sintaxe

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:

  • -d Pega o o resultado da TestString e verifica se é um diretório existente
  • -f Pega o o resultado da TestString e verifica se é um arquivo existente
  • -s Faz o mesmo que o -f, mas só considera arquivos não-vazios
  • -l Verifica se o resultado da TestString é caminho para um link simbólico
  • -x Verifica se o resultado da TestString é um caminho com permissão +x
  • -F Equivale 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.
  • -U Mesmo que o -F, mas testa por URL e não Path

Todos estes testes podem ser negados com uma ! no início.

Variáveis

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 do host remoto

  • 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 o REQUEST_URI.

  • REQUEST_SCHEME retorna usualmente http ou https, dependendo da conexão.

  • REQUEST_URI é uma das variáveis mais usadas. É a que tem o caminho da requisição, como por exemplo index.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 exemplo GET /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.

Sintaxe

 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:

  • L considera este sendo o último Rewrite, não aplicando mais nenhuma regra que modifique o URL

  • R=code faz um redirect com o código indicado (ex: 301, 302)

  • NC (No-case) faz comparações ignorando maiúsculas e minúsculas

  • N refaz 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)

  • CO seta um cookie no formato CO=NAME:VAL:domain[:lifetime[:path[:secure[:httponly]]]]

A descrição completa das flags se encontra na documentação.

Exemplo:

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment