ordem de sintaxe mod_rewrite
mod_rewrite possui algumas regras de pedidos específicas que afetam o processamento. Antes que qualquer coisa seja feita, a RewriteEngine On
diretiva precisa ser fornecida, pois isso ativa o processamento mod_rewrite. Isso deve ocorrer antes de qualquer outra diretiva de reescrita.
RewriteCond
anterior RewriteRule
torna essa regra sujeita à condicional. Quaisquer RewriteRules a seguir serão processadas como se não estivessem sujeitas a condicionais.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
Nesse caso simples, se o referenciador HTTP for de serverfault.com, redirecione as solicitações de blog para páginas especiais de falha do servidor (somos tão especiais assim). No entanto, se o bloco acima tiver uma linha RewriteRule extra:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg $/blog/$1.sf.jpg
Todos os arquivos .jpg iriam para as páginas especiais de falha do servidor, não apenas aquelas com um referenciador indicando que ele veio daqui. Claramente, essa não é a intenção de como essas regras são escritas. Isso pode ser feito com várias regras RewriteCond:
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Mas provavelmente deve ser feito com alguma sintaxe de substituição mais complicada.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
O RewriteRule mais complexo contém os condicionais para processamento. O último parênteses, (html|jpg)
diz ao RewriteRule para corresponder a um html
ou jpg
, e para representar a sequência correspondente como $ 2 na sequência reescrita. Isso é logicamente idêntico ao bloco anterior, com dois pares RewriteCond / RewriteRule, apenas o faz em duas linhas, em vez de quatro.
Várias linhas RewriteCond são implicitamente ANDed e podem ser explicitamente ORed. Para manipular referenciadores do ServerFault e do Superusuário (OR explícito):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [OR]
RewriteCond %{HTTP_REFERER} ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
Para veicular as páginas referidas ServerFault nos navegadores Chrome (AND implícito):
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg) /blog/$1.sf.$2
RewriteBase
também é específico do pedido, pois especifica como as RewriteRule
diretivas a seguir lidam com o processamento. É muito útil em arquivos .htaccess. Se usada, deve ser a primeira diretiva em "RewriteEngine on" em um arquivo .htaccess. Veja este exemplo:
RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Isso está dizendo ao mod_rewrite que esse URL específico que ele está manipulando chegou por meio de http://example.com/blog/ em vez do caminho do diretório físico (/ home / $ Username / public_html / blog) e para tratá-lo adequadamente. Por isso, RewriteRule
considera que o início da cadeia de caracteres está após o "/ blog" no URL. Aqui está a mesma coisa escrita de duas maneiras diferentes. Um com RewriteBase, o outro sem:
RewriteEngine On
##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg) $1.sf.$2
##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg) $1.sf.$2
Como você pode ver, RewriteBase
permite reescrever regras para aproveitar o caminho do conteúdo do site em vez do servidor da web , o que pode torná-las mais inteligíveis para quem edita esses arquivos. Além disso, eles podem reduzir as diretrizes, o que tem um apelo estético.
Sintaxe de correspondência RewriteRule
O próprio RewriteRule possui uma sintaxe complexa para seqüências de caracteres correspondentes. Vou cobrir as bandeiras (coisas como [PT]) em outra seção. Como os administradores de sistemas aprendem pelo exemplo com mais frequência do que lendo uma página de manual, darei exemplos e explicarei o que eles fazem.
RewriteRule ^/blog/(.*)$ /newblog/$1
A .*
construção corresponde a qualquer caractere único ( .
) zero ou mais vezes ( *
). Colocá-lo entre parênteses indica que você forneça a sequência que correspondeu à variável $ 1.
RewriteRule ^/blog/.*/(.*)$ /newblog/$1
Nesse caso, o primeiro. * NÃO foi colocado entre parênteses, portanto, não é fornecido para a sequência reescrita. Esta regra remove um nível de diretório no novo site do blog. (/blog/2009/sample.html se torna /newblog/sample.html).
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$2
Nesse caso, a primeira expressão entre parênteses configura um grupo correspondente. Isso se torna $ 1, o que não é necessário e, portanto, não é usado na string reescrita.
RewriteRule ^/blog/(2008|2009)/(.*)$ /newblog/$1/$2
Nesse caso, usamos $ 1 na string reescrita.
RewriteRule ^/blog/(20[0-9][0-9])/(.*)$ /newblog/$1/$2
Esta regra usa uma sintaxe de colchete especial que especifica um intervalo de caracteres . [0-9] corresponde aos números de 0 a 9. Esta regra específica tratará os anos de 2000 a 2099.
RewriteRule ^/blog/(20[0-9]{2})/(.*)$ /newblog/$1/$2
Isso faz o mesmo que a regra anterior, mas a parte {2} diz para ele corresponder ao caractere anterior (uma expressão de colchete nesse caso) duas vezes.
RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html /newblog/$1/$2.shtml
Esse caso corresponderá a qualquer letra minúscula na segunda expressão correspondente e o fará com o máximo de caracteres possível. A \.
construção diz para tratar o período como um período real, não como o caractere especial nos exemplos anteriores. Ele será interrompido se o nome do arquivo contiver traços.
RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html /newblog/$1/$2.shtml
Isso intercepta nomes de arquivos com traços neles. No entanto, como -
é um caractere especial nas expressões entre colchetes, ele deve ser o primeiro caractere na expressão.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Esta versão captura qualquer nome de arquivo com letras, números ou o -
caractere no nome do arquivo. É assim que você especifica vários conjuntos de caracteres em uma expressão entre colchetes.
Sinalizadores RewriteRule
As bandeiras nas regras de reescrita têm vários significados e casos especiais .
RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html /newblog/$1/$2.shtml [L]
A bandeira está [L]
no final da expressão acima. Vários sinalizadores podem ser usados, separados por vírgula. A documentação vinculada descreve cada uma, mas aqui estão elas de qualquer maneira:
L = Último. Pare de processar RewriteRules quando este corresponder. A ordem conta!
C = Cadeia. Continue processando a próxima RewriteRule. Se essa regra não corresponder, a próxima regra não será executada. Mais sobre isso mais tarde.
E = Definir variável ambiental. O Apache possui várias variáveis ambientais que podem afetar o comportamento do servidor da web.
F = Proibido. Retorna um erro proibido 403 se esta regra corresponder.
G = Se foi. Retorna um erro 410-Gone se esta regra corresponder.
H = manipulador. Força a solicitação a ser tratada como se fosse o tipo MIME especificado.
N = Avançar. Força a regra a recomeçar e corresponder. SEJA CUIDADOSO! Loops podem resultar.
NC = Sem caso. Permitejpg
para corresponder a jpg e JPG.
NE = Sem escapatória. Impede a reescrita de caracteres especiais (.? # & Etc) em seus equivalentes de código hexadecimal.
NS = Nenhuma sub-solicitação. Se você estiver usando inclusões do lado do servidor, isso impedirá correspondências com os arquivos incluídos.
P = Proxy. Força a regra a ser manipulada por mod_proxy. Forneça de forma transparente o conteúdo de outros servidores, porque o seu servidor da Web o busca e serve novamente. Esta é uma bandeira perigosa, uma vez que uma mensagem mal escrita transformará seu servidor da Web em um proxy aberto e Isso é Ruim.
PT = Passagem Completa. Leve em conta as instruções de alias na correspondência RewriteRule.
QSA = QSAppend. Quando a string original contém uma consulta ( http://example.com/thing?asp=foo) anexa a string de consulta original à string reescrita. Normalmente seria descartado. Importante para conteúdo dinâmico.
R = Redirecionar. Forneça um redirecionamento HTTP para o URL especificado. Também pode fornecer código de redirecionamento exato [R = 303]. Muito parecido com o RedirectMatch
que é mais rápido e deve ser usado quando possível.
S = Ignorar. Pule esta regra.
T = tipo. Especifique o tipo MIME do conteúdo retornado. Muito parecido com a AddType
diretiva.
Você sabe como eu disse que RewriteCond
se aplica a uma e apenas uma regra? Bem, você pode contornar isso encadeando.
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html /blog/$1.sf.html [C]
RewriteRule ^/blog/(.*)\.jpg /blog/$1.sf.jpg
Como o primeiro RewriteRule possui o sinalizador Chain, a segunda regra de regravação será executada quando o primeiro, ou seja, quando a regra RewriteCond anterior for correspondida. Útil se as expressões regulares do Apache fizerem seu cérebro doer. No entanto, o método all-in-one-line que aponto na primeira seção é mais rápido do ponto de vista da otimização.
RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html /newblog/$1/$2.shtml
Isso pode ser simplificado através de sinalizadores:
RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html /newblog/$1/$2.shtml [NC]
Além disso, alguns sinalizadores também se aplicam ao RewriteCond. Notavelmente, NoCase.
RewriteCond %{HTTP_REFERER} ^https?://serverfault\.com(/|$) [NC]
Corresponderá a "ServerFault.com"