Dopo averci combattuto per molti giorni, finalmente ho risolto un problema che affliggeva un’applicazione web sulla quale sto lavorando in azienda.
Il problema, che al solito si verificava solo su Internet Explorer (dalla versione 6 in avanti, almeno fino alla 8, non ho verificato la 9), impediva agli sfortunati utilizzatori di questo browser, di scaricare file pdf generati dall’applicazione web.
Internet Explorer, oltre a non rispettare correttamente tutti gli header http che l’applicazione web genera, ha infatti un bug che impedisce di scaricare file pdf se la connessione è protetta da SSL, come riportato dalla stessa microsoft
When you try to open a Microsoft Office document or a PDF file by typing an HTTPS URL for the document in the Address bar of Internet Explorer 6 Service Pack 1 (SP1), you may receive the following error message:
Unable to download.
Internet Explorer was unable to open this site. The requested site is either unavailable or cannot be found. Please try again later.
In pratica è necessario prima di inviare il file, rimuovere due header http nel seguente modo, così da settarli vuoti ed “ingannare” Internet Exploder.
header("Pragma: ");
header("Cache-Control: ");
Nel mio caso, essendo l’applicazione web sviluppata con Symfony 1.4, ho modificato il tutto nel seguente modo:
$response->clearHttpHeaders();
$response->setContentType('application/force-download');
/**
* Empty pragma and cache-control to allow IEx to download file through ssl
* http://support.microsoft.com/kb/323308/en-us
**/
$response->setHttpHeader('Pragma','',true);
$response->setHttpHeader('Cache-Control','',true);
/*************************************************/
$response->setHttpHeader('Content-Disposition', 'attachement; filename='.$this->filename, true);
$response->setContent(file_get_contents($filename));
return sfView::NONE;
Ossia per precauzione cancello tutti gli header http eventualmente settati nella risposta, quindi setto il content-type ad application/force-download per evitare un altro comportamento non desiderato di ie, procedo settando gli header pragma e cache-control vuoti, metto nel content della risposta il contenuto del file che voglio far scaricare e quindi disabilito la vista.
Ovviamente con tutti gli altri browser testati (Firefox 3 e superiori, Chrome 9+, Opera 10+) funzionava senza alcun problema anche in precedenza.
La morale è: per favore non utilizzate Internet Explorer, usate un browser rispettoso degli standard web, possibilmente aggiornato e per il quale non sia necessario per funzionare ricorrere sempre ad hack e workaround vari.
Consiglio sempre, sia quando mi trovo nei peggiori bar di Caracas sia nelle applicazioni web che sviluppo e/o mantengo, il sito abetterbrowser in cui vengono consigliati alcuni browser alternativi e migliori.