.htaccess - redirecionar favicon
Pergunta
Como faço para redirecionar todos os pedidos de favicon.ico no diretório raiz ou qualquer subdiretório para /images/favicon.ico
Solução
Experimente esta regra:
RewriteEngine on
RewriteRule ^favicon\.ico$ /images/favicon.ico [L]
EditarE para favicon.ico Com profundidade de segmento de caminho arbitrário:
RewriteCond $0 !=images/favicon.ico
RewriteRule ^([^/]+/)*favicon\.ico$ /images/favicon.ico [L]
Outras dicas
Para um favicon em www.mysite.com/images/favicon.ico
O método mais robusto seria:
RewriteCond %{REQUEST_URI} !^/images/favicon\.ico$ [NC]
RewriteCond %{HTTP_HOST} (.+)
RewriteRule ^(.*)favicon\.(ico|gif|png|jpe?g)$ http://%1/images/favicon.ico [R=301,L,NC]
Explicação:
RewriteCond %{REQUEST_URI} !^/images/favicon\.ico [NC]
:
- Garante que a regra de redirecionamento não se aplique se o URI correto for solicitado (por exemplo, um redirecionamento 301 escreverá o Uri Correto do Favicon para o Cache do navegador - e essa linha evitará o processamento da regra se o navegador solicitar o URI correto)
- [NC] significa que não é sensível ao caso
RewriteCond %{HTTP_HOST} (.+)
:
- Recupera o nome do host http - para evitar codificar o nome do host no RewriteRule
- Isso significa que você pode copiar seu arquivo .htaccess entre servidor local/de teste e servidor de produção sem problemas (ou a necessidade de re-hardcode seu novo URL base do site em seu reescritor)
RewriteRule ^(.*)favicon\.(ico|gif|png|jpe?g)$ http://%1/images/favicon.ico [R=301, L]
:
- ^
é o começo do regex
- (.*)
é um grupo curinga - o que significa que pode haver zero ou qualquer número de caracteres antes da palavra favicon
No URI (ou seja, esta é a parte que permite que o diretório raiz ou qualquer subdiretor seja incluído na partida URI)
- \.(ico|gif|png|jpe?g)
verifica se a extensão URI corresponde a qualquer um dos .ico
, .gif
, .png
, .jpg
, .jpeg
- $
é o fim do regex
- http://%1/images/favicon.ico
é o URL de redirecionamento - e injeta o nome do host que recuperamos no anterior RewriteCond
. Observe que o %1
é um chamado Reescreva -se reescrita de referência isso significa que é o último RewriteCond
isso foi atendido. (por exemplo: %2
Seria o 2º eixo RewriteCond
isso para ter sido atendido)
- R=301
Significa que é um redirecionamento permanente - que armazena o redirecionamento no cache do navegador. Tenha cuidado ao testar - você precisará excluir o cache do navegador entre as alterações do código ou o redirecionamento não atualizará. Provavelmente deixe isso de fora até saber que a regra funciona.
- L
significa que é o último redirecionamento a ser seguido neste .htaccess
Arquivo - Você não precisará disso para que a regra funcione, pois a linha 1 não será atendida assim que o navegador for direcionado para o URL correto. Sem a linha 1 ou L
O reescriture resultará em um loop permanente (uma vez que o URL de redirecionamento continuará satisfazendo o RewriteRule
condições). No entanto, é uma boa ideia adicionar o L
De qualquer forma, se você tiver outras regras após as regras do Favicon - já que, em uma solicitação Favicon.ICO, você pode (provavelmente) ignorar as seguintes regras.
Você pode testar .htaccess
regras em http://htaccess.mwl.be/
Nota final:
- Tenha cuidado para não ter nenhum outro reescriteiro em um .htaccess
arquivo localizado em qualquer um dos seus subdiretos.
- por exemplo, se você colocar isto responda em seu www.mysite.com/
pasta raiz .htaccess
arquivo, a RewriteRule (.*) xxx
Digite regra em seu www.mysite.com/images/
A pasta pode mexer com os resultados.
RewriteEngine on
RewriteRule ^(.*)favicon\.ico /images/favicon.ico [L]
Eu sei que a pergunta está marcada .htaccess
Mas, por que não usar um symblink?
ln -s images/favicon.ico favicon.ico
Esta rápida reescrita deve fazer o truque:
RewriteRule ^(.*)favicon.ico /images/favicon.ico