2009-02-05 4 views
7

En regardant à travers mes journaux de serveur, je vois que beaucoup de pages sur mon site demandent favicon.ico, favicon.jpg, favicon.png, etc dans une variété de répertoires différents.mod_rewrite regex pour correspondre seulement si une certaine chaîne n'existe pas

au lieu de patauger dans chaque page pour essayer de savoir où chaque demande incorrecte vient, j'écris une apache des règles de redirection pour changer une demande de toute URL contenant "favicon" pour rediriger vers /favicon.ico

Mon premier tentative naïve était le suivant:

RewriteRule favicon /favicon.ico [R=301,L] 

Mais cela veut dire que lorsque vous avez réellement demandé /favicon.ico il vous envoie dans une boucle de redirection infinie.

En fait ce que je pense que je dois est une expression régulière qui a cet effet:

| Request    | Response  | 
|------------------------|--------------| 
| favicon.png   | /favicon.ico | 
| directory/favicon.png | /favicon.ico | 
| directory/favicon.ico | /favicon.ico | 
| favicon.ico   | <no match> | 

Répondre

6

Essayez cette

RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC] # if not already going to favicon.ico 
RewriteCond %{REQUEST_URI} favicon\.ico [NC] # edit this line to match your favicon matching regex 
RewriteRule (.*) http://www.domain.com.au/favicon.ico [R=301,L] #redirect to the real address 
+0

hey merci alex! – nickf

+0

pas de soucis, vous avez répondu assez de mes questions :) – alex

+0

J'ai fait quelques suggestions à cette excellente réponse dans ma propre réponse. – Dscoduc

0

J'utiliser cette règle:

RewriteCond %{REQUEST_URI} !^/favicon\.ico$ 
RewriteRule favicon /favicon.ico [L,R=301] 
11

Couple de changements Je suggère de modifier Alex's excellent answer:

Gardez cette section même:

RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC] 

Vérifiez plus que l'extension .ico à la fin de la demande:

RewriteCond %{REQUEST_URI} favicon\.(ico|png|gif)$ [NC] 

Ajouter une 3ème condition saisit la demande actuelle nom d'hôte:

RewriteCond %{HTTP_HOST} (.+) 

changer Enfin la dernière RewriteRule d'utiliser un% 1 (a backreference representing the last matched condition):

RewriteRule (.*) http://%1/favicon.ico [R=301,L] 

Le résultat final ressemblerait à ceci:

RewriteCond %{REQUEST_URI} !^/favicon\.ico [NC] 
RewriteCond %{REQUEST_URI} favicon\.(ico|png|gif)$ [NC] 
RewriteCond %{HTTP_HOST} (.+) 
RewriteRule (.*) http://%1/favicon.ico [R=301,L] 

Hope this helps quelqu'un ...

+1

+1 bonne réponse détaillée! – alex

+0

Quelque chose que j'ai fait l'autre jour, est de changer le vérificateur d'extension. (Ico | gif | png | jpe? G) pour une bonne mesure :) – alex

+0

la règle de réécriture devrait être 'RewriteRule (. *) Http: //% 1 /favicon.ico [R = 301, L] 'puisque le'% 1' est un 'backreference' - en d'autres termes'% 1' donnera la dernière RewriteRule correspondante alors que '% 3' donnera le troisième et dernier RewriteCond correspondant (qui est ce cas est le premier RewriteCond et peut même ne pas avoir une 'partie groupée') - voir http://httpd.apache.org/docs/current/mod/mod_rewrite.html#rewritecond – goredwards

1

Du haut de ma tête:

RewriteRule favicon[.](\w*)$ /favicon.ico [L] 
Questions connexes