URL “simpatici” in IIS

In Apache, il noto server web open-source, è presente una funzionalità molto amata dai SEO, coloro che ottimizzano i siti per i motori di ricerca. Si tratta della possibilità di riscrivere gli URL (URL rewrite), ovvero redirigere in modo trasparente le richieste verso un’altra pagina anziché restituire l’errore 404 (non trovato). Questo permette di creare URL più semplici da leggere e con parole chiave apprezzate dai motori di ricerca e, contemporaneamente, permette di scrivere un solo script CGI che si occupa di gestire le richieste ed interrogare il database.

Gli utenti di IIS purtroppo non hanno questa funzionalità in modo nativo. È possibile emularla installando dei filtri ISAPI aggiuntivi, quasi tutti a pagamento, da aggiungere nella configurazione del sito web oppure creando un pagina di errore personalizzata. Consiglio la seconda possibilità, in quanto più semplice da realizzare e da manutenere.

Errore 404 personalizzato in IIS

Gli “errori personalizzati” in IIS servono per restituire al client una pagina alternativa al classico “Impossibile visualizzare la pagina”. È possibile specificare sia un file statico, che può risiedere in qualsiasi punto del server, sia una URL che deve risiedere nel sito web corrente. Nel nostro caso bisogna gestire l’errore 404 che si verifica quando il server riceve una richiesta riguardo un file che non esiste.

GET http://www.flyonthenet.com/file-che-non-esiste.html

Per modificare il valore, basta accedere alla console di amministrazione di IIS e nella maschera delle proprietà del sito web, cliccare su “Errori personalizzati”, quindi clic su “Modifica proprietà”, infine su “Tipo messaggio” selezionamo “URL” ed indichiamo sulla casella sottostante il nostro script, ad esempio in PHP. Questo verrà chiamato da IIS aggiungendo alcuni parametri, utili per ricostruire l’URL originariamente richiesto dal client.

GET http://www.flyonthenet.com/wp-404.php?404;http://www.flyonthenet.com/file-che-non-esiste.html

A questo punto non resta che creare lo script e gestire la richiesta. Normalmente si interroga un database per cercare un riscontro: se viene trovato qualcosa, si risponde con 200 OK e si genera la pagina, altrimenti si restituisce lo status 404 Not Found. È importante alla fine impostare correttamente lo status nelle intestazioni di risposta HTTP. L’errore più comune è quello di restuituire sempre lo status 200 anche se non si trova la risorsa nel database (soft 404): alcuni motori di ricerca lo considerano un errore e penalizzano il ranking del sito.

//In questo esempio $record dovrebbe contenere del codice HTML estratto da un database
if($record)
{
header('HTTP/1.1 200 OK');
header('Status: 200 OK');
echo $record;
}
else
{
header('HTTP/1.1 404 Not Found');
header('Status: 404 Not Found');
echo 'HTTP 404 Not Found

HTTP 404 Not Found

';
}

Se si utilizza la piattaforma WordPress, lo script diventa molto semplice, in quanto WordPress stesso si occupa di restituire i corretti codici di stato HTTP, nel caso in cui venga richiesto un articolo inesistente.


//Indirizzo del sito di WordPress
$siteurl = 'http://' . $_SERVER['SERVER_NAME'];

//Wordpress usa PATH_INFO coi permalinks, ma per compatibilità con alcuni plug-in conviene modificare anche REQUEST_URI
$_SERVER['PATH_INFO'] = substr($_SERVER['QUERY_STRING'], strpos($_SERVER['QUERY_STRING'], $siteurl) + strlen($siteurl));
$_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'];

//La querystring potrebbe contenere 2 punti di domanda, che crea confusione nell'array $_GET
foreach($_GET as $get_key=>$get_value)
if(strpos($get_key, '?') !== FALSE)
$_GET[substr(strstr($get_key, '?'), 1)] = $get_value;

//Pulizia variabili
unset($siteurl);

//Include il file index.php di WordPress, dando per scontato che si trovi nella stessa directory
include('index.php');

Per gestire correttamente le richieste POST, è opportuno specificare uno script anche per l’errore 405 (Risorsa non consentita), che in alcuni casi viene generato al posto di 404.