Redirigere la chiamata a file non esistenti

meerkat

Restando in tema di file .htaccess, condivido con voi qualche modifica che ho introdotto recentemente dopo aver dato uno sguardo al registro degli errori del mio hosting provider. Tra le righe presenti notavo che si tentava si accedere ripetutamente al file favicon.ico sia cercandolo nella directory radice del sito (dove non è presente) sia in altre posizioni, nonostante la chiamata al file favicon.ico era correttamente generata nell’HTML dal tema in uso.

Per questo motivo ho aggiunto alcune righe in .htaccess, in modo da dirigere la ricerca del file in questione.

Il file favicon.ico

Ecco cosa ho aggiunto nel file di configurazione di Apache:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/percorso/a/favicon\.ico [NC]
    RewriteCond %{REQUEST_URI} favicon\.ico [NC]
    RewriteRule .* http://www.example.com/percorso/a/favicon.ico [R=301,L]
</IfModule>

Queste righe fanno le seguenti operazioni:

  1. controllare se è presente il modulo mod_rewrite in Apache;
  2. attivare il motore di rewrite;
  3. porre la prima condizione: l’URL richiesto non è quello del file favicon.ico corretto;
  4. porre la seconda condizione: l’URL contiene la stringa favicon.ico;
  5. avviare la regola: indirizza la richiesta alla posizione corretta e applica uno status HTTP 301 “Moved permanently”.

Così, ad esempio, uno qualsiasi dei seguenti indirizzi:

http://www.example.com/files/favicon.ico
http://www.example.com/tag/apache/favicon.ico

viene indirizzato a:

http://www.example.com/percorso/a/favicon.ico

dove è presente fisicamente il file.

Altri file

Il file favicon.ico non è il solo ad essere vittima di questa ricerca errata, ma anche robots.txt, sitemap.xml e humans.txt. Possiamo quindi aggiungere anche queste righe, dove ogni blocco di righe si riferisce a uno specifico file:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/robots\.txt [NC]
    RewriteCond %{REQUEST_URI} robots\.txt [NC]
    RewriteRule .* http://www.domain.tld/robots.txt [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/sitemap\.xml [NC]
    RewriteCond %{REQUEST_URI} sitemap\.xml [NC]
    RewriteRule .* http://www.domain.tld/sitemap.xml [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_URI} !^/humans\.txt [NC]
    RewriteCond %{REQUEST_URI} humans\.txt [NC]
    RewriteRule .* http://www.domain.tld/humans.txt [R=301,L]
</IfModule>

Potete trovare l’argomento spiegato più in dettaglio nel libro di Jeff Starr, .htaccess made easy, A practical guide for administrators, designers & developers, Perishable Press, 2013, di cui vi ho già parlato in questo precedente post.

Photo courtesy: peterstuartmill, Senza titolo, CC0 Public Domain.