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.

Impossibile avviare il lavoro di stampa in Acrobat

Durante la stampa di un documento PDF tramite il programma Adobe Reader (storicamente noto come Acrobat Reader), può comparire il messaggio “Impossibile avviare il lavoro di stampa: La stampante è disponibile?”. Il problema è localizzato solo in alcune pagine: le restanti si stampano correttamente, e a nulla serve cambiare la stampante di destinazione o stampare il documento come immagine.

Il problema è apparentemente causato dalle marcature, ovvero delle correzioni del testo inserite in fase di revisione del documento, che teoricamente dovrebbero essere rimosse nella pubblicazione definitiva. Le marcature sono visibili in Adobe Reader solo se nel PDF ci vengono assegnati i diritti di utilizzo aggiuntivi.

Per stampare il documento, nella finestra di dialogo di stampa, bisogna selezionare “Documento” nella lista di selezione “Commenti e moduli”. L’opzione predefinita è “Documento e marcature”.

Acrobat - Stampa - Commenti e moduli

La soluzione è stata provata in Acrobat Reader 8.1 su Windows Vista Business.

I messaggi di Outlook Express rimangono sempre in “Posta in Uscita”

Quando i messaggi che abbiamo inviato tramite Outlook Express rimangono sempre in coda nella cartella “Posta in Uscita”, nonostante sia già stato ricevuto dal destinatario, ed ogni volta che facciamo “Invio/Ricevi” Outlook Express ne tenta nuovamente l’invio, significa che il programma non riesce a spostare i messaggi nella cartella “Posta Inviata”.

Il problema è causato dal file “Posta Inviata.dbx” danneggiato: purtroppo questi database si rovinano facilmente, soprattutto quando raggiungono una dimensione attorno ai 500MB. Al contrario di Office Outlook, purtroppo non è fornito alcun strumento per la riparazione degli archivi: l’unica funzione offerta è la compattazione, per recuperare lo spazio occupato dai messaggi cancellati (operazione da eseguire con cautela e scollegati da Internet).

L’unico modo per ripristinare il corretto funzionamento, senza ricorrere a programmi di terze parti in genere a pagamento, è quello di far ricreare ad Outlook Express un nuovo file DBX.

  • Posizionarsi con Esplora Risorse nella cartella contenente i file DBX della posta, il percorso è ottenibile da Strumenti > Opzioni > Manutenzione > Archivia cartella
  • Chiudere Outlook Express
  • Rinominare il file “Posta inviata.dbx” a piacere
  • Riavviare Outlook Express

Un nuovo file “Posta inviata.dbx” verrà automaticamente creato nel quale verranno salvati tutti i messaggi della posta in uscita, questa volta si spera con maggior successo. 😉

Se il database non è eccessivamente danneggiato, con un piccolo trucco è possibile tentare il recupero dello storico dei messaggi.

  • In Outlook Express creare una nuova cartella dal nome “Archivio”
  • Posizionarsi nuovamente nella cartella contenente i file DBX della posta
  • Chiudere Outlook Express
  • Cancellare il file “Archivio.dbx”
  • Rinominare il vecchio file della posta inviata in “Archivio.dbx”
  • Riavviare Outlook Express

Ora tutta la vecchia posta inviata dovrebbe essere presente nella cartella “Archivio”. Consiglio di non spostare i messaggi nella nuova “Posta Inviata” e di tenere questo archivio solo per ricercare e consultare i vecchi messaggi inviati.

Per prevenire del tutto il problema, consiglio di passare ad un client di posta più evoluto, quale Thunderbird, che salva i messaggi nel formato standard mbox, più facilmente recuperabili.

Passaggio di parametri dal server al client JavaScript

Molto spesso nello sviluppo di un sito Internet può capitare di dove inviare alcune informazioni salvate nel database ad uno script che andrà eseguito nel client dal browser.

Il metodo più semplice e diffuso è quello di passare i parametri direttamente in un blocco di codice JavaScript in linea, assieme al codice del documento HTML.

<?php
myText = "Testo che proviene dal server";
myURL = "http://url-letto-dal-server.com";
?>
alert("<?php echo myText ?>");
location.href = "<?php echo myURL ?>";

Per mantenere il codice maggiormente pulito, sarebbe ideale inserire tutti gli script JS e i fogli di stile CSS in file esterni, in modo da separare parte dinamica e la formattazione dai contenuti del documento HTML. In questo modo il nostro sito diventa più semantico, oltre che più accessibile. Si pone però il problema di far avere dei parametri agli script esterni senza richiamare ulteriori script lato server e consumare risorse.

Prima di HTML5

I tag META, nella sezione HEAD, sono da sempre usati per aggiungere informazioni al documento, normalmente per fornire l’autore, la data di modifica ed altre informazioni agli spider dei motori di ricerca. Le raccomandazioni del w3c non definiscono e non limitano quali siano le informazioni che possano essere trasmesse, quindi nessuno ci impedisce di creare dei meta-dati personalizzati. La soluzione che propongo è di inserire i valori di cui abbiamo bisogno in nostri tag META ed accedervi da JavaScript utilizzando le funzioni del DOM. Se il dato da trasmettere è un URI, le raccomandazioni del w3c consigliano di usare il tag LINK.

<meta name="myText" id="myText" value="<?php echo myText ?>" />
<link rel="myURL" id="myURL" href="<?php echo myText ?>" />
alert(document.getElementById("myText").value);
location.href = document.getElementById("myURL").href;

Il codice dello script ora può essere comodamente inserito in un file esterno con estensione JS da collegare al documento. Gli script del server dovranno generare un’unica pagina HTML, utilizzando le stesse risorse di calcolo della soluzione classica, ma sia la manutenzione del codice javascript che la sua leggibilità sono notevolmente migliorate.

Soluzione attuale per HTML 5

La soluzione precente, seppur perfettamente funzionante anche con HTML5, ha un problema: durante la convalida del codice con il validatore W3c causerà degli errori. Questo perché HTML5 non consente l’uso di meta e link tag personalizzati.

Lo stesso HTML5 però ha previsto la possibilità di utilizzare degli attributi aggiuntivi personalizzati, da inserire a piacere in qualsiasi tag, che non causeranno errori di convalida. Questi attributi devo iniziare con il suffisso data-.

<body data-myText="<?php echo myText ?>" data-myURL="<?php echo myURL ?>">
alert(document.body.getAttribute("myText"));
location.href = document.body.getAttribute("myURL");

.

Video e contenuti multimediali con il tag OBJECT

Nei browser basati su Gecko, quali Mozilla Firefox, è pienamente supportata la capacità di inserire video, animazioni e contenuti multimediali utilizzando il nuovo tag OBJECT, secondo quanto previsto dalle raccomandazioni W3C.

Anche se è ancora possibile utilizzare il tag EMBED per il medesimo scopo, è sconsigliato il suo utilizzo in quanto si tratta di un tag deprecato e che in futuro probabilmente verrà abolito.

Esistono tuttavia dei problemi di compatibilità con Internet Explorer: i browser Gecko – ed in genere tutti i browser che si attengono alle raccomandazioni W3C – richiedono di identificare il contenuto specificando il tipo MIME dell’oggetto da includere, mentre Internet Explorer richiede quale plug-in/ActiveX usare tramite il suo codice GUID univoco. Bisogna prestare molta attenzione alla sintassi dei tag OBJECT, affinché i browser Gecko li accettino senza comprometterne la compatibilità.

In questa pagina raccogliamo la sintassi cross-browser e standard-compliant del tag OBJECT per i formati più comuni.

Shockwave Flash (Adobe Macromedia)

Tipo MIME: application/x-shockwave-flash
Estensione: SWF
Sito web: http://www.adobe.com/shockwave/
Requisiti del client: Flash Player
Compatibilità: Mozilla Firefox1.0+ Mozilla Suite1.0+ Seamonkey1.0+ Camino1.0+ Netscape Navigator8.0+ Microsoft Internet Explorer5.0+ Opera8.0+ Konqueror3.0+



Esempio

Applet Java (Sun Microsystems)

Tipo MIME: application/x-java-applet
Estensione: CLASS, JAR, JNPL
Sito web: http://java.sun.com/
Requisiti del client: Java Runtime Environment
Compatibilità: Mozilla Firefox1.0+ Mozilla Suite1.0+ Seamonkey1.0+ Camino1.0+ Netscape Navigator8.0+ Microsoft Internet Explorer6.0+ Opera8.0+ Safari2.0+ Konqueror3.0+






Esempio

WMV – Windows Media Video (Microsoft Corporation)

Tipo MIME: video/x-ms-wmv
Estensione: WMV
Sito web: http://www.microsoft.com/windows/windowsmedia/
Requisiti del client: Windows Media Player, MPlayer
Compatibilità: Mozilla Firefox1.0+ Mozilla Suite1.0+ Seamonkey1.0+ Netscape Navigator8.0+ Microsoft Internet Explorer5.0+ Opera8.0+ Konqueror3.0+



Esempio

WMA – Windows Media Audio (Microsoft Corporation)

Tipo MIME: audio/x-ms-wma
Estensione: WMA

Vedi guida per WMV

ASF – Advanced Streaming Format (Microsoft Corporation)

Tipo MIME: application/asx, video/x-ms-asf
Estensione: ASF, ASX

Vedi guida per WMV

QuickTime (Apple Computer)

Tipo MIME: video/quicktime
Estensione: MOV
Sito web: http://www.apple.com/quicktime/
Requisiti del client: QuickTime Player, QuickTime Alternative, MPlayer
Compatibilità: Mozilla Firefox1.0+ Mozilla Suite1.0+ Seamonkey1.0+ Camino1.0+ Netscape Navigator8.0+ Microsoft Internet Explorer6.0+ Opera8.0+ Konqueror3.0+






Esempio

RealMedia (Real Networks)

Tipo MIME: audio/x-pn-realaudio-plugin
Estensione: RM, RA, RV, RPM
Sito web: http://www.real.com/
Requisiti del client: Real Player, Real Alternative, MPlayer
Compatibilità: Mozilla Firefox1.0+ Mozilla Suite1.0+ Seamonkey1.0+ Camino1.0+ Netscape Navigator8.0+ Microsoft Internet Explorer6.0+


Esempio

SVG – Scalable Vector Graphics (W3C)

Tipo MIME: image/svg+xml
Estensione: SVG
Sito web: http://www.w3.org/Graphics/SVG/
Requisiti del client: Gecko 1.8+ (supporto nativo), Adobe SVG Viewer
Compatibilità: Mozilla Firefox1.5+ Seamonkey1.0+ Camino1.0+ Netscape Navigator8.0+ Microsoft Internet Explorer6.0+ Opera8.0+ Konqueror3.0+