Tra tutti i browser del mondo, quello che mi da più rotture è Internet Explorer. Ho smesso anche di usarlo, ma non per sentimenti di ribellione incondizionata e pinguinosa nei confronti di Microsoft, ma perché credo che Firefox sia meglio, soprattutto se di lavoro si fa lo sviluppatore web. Nonostante tutte però gli utenti usano IE, e parecchi ancora usano IE 6.
In particolare Internet Explorer 6 mi ha dato una bella gatta da pelare con i file da scaricare.
In un’applicazione web che ho scritto è possibile scaricare alcuni file, solo da parte di utenti registrati. Quindi i file stanno fuori dalla visibilità del browser e vengono serviti da un file (download.php, nel mio caso) che, dopo aver fatto i relativi controlli a login e permessi vari, cambia gli header in modo da far scaricare il file scelto. Semplificando molto è una cosa simile:
1 2 3 4 5 6 7 8 9 10 11 | <?php session_start(); $db = new db(); checkPermission($_GET['id'],$_SESSION['userid']) || die(); $file = $db->query("SELECT * FROM attachments WHERE id = ".$db->quote($_GET['id']); header ("Content-type: ".$file['mime']); header ("Content-disposition: attachment; filename=".$file['name']); header ("Content-Transfer-Enconding: binary"); @readfile($file['full_path']); exit(); ?> |
Risultato? Con Firefox nessun problema, con IE 7 nessun problema (eh meno male!!) ma con IE6… disastro!! I file venivano scaricato, ma IE6 ignorava bellamente l’header content-type e l’header content-disposition, nominando il file “download.php”.
Le ho provate davvero tutte per ovviare a questo problema, cambiare header rigurdanti la cache,ecc. ecc., ma l’unico effetto che sono riuscito ad ottenere è stato che il file non si chiamava più download.php, ma download.pdf piuttosto che download.zip…ma io voglio il nome corretto!!!
Google alla mano, ho fatto mille ricerche che non hanno portato a nulla finchè non sono arrivato a questa pagina: http://www.sitefoundry.com/broken_msie.html
e qui ho appreso che per un baco, IE6 in questi casi tenta sempre due richieste andando in errore e che a differenza di Firefox utilizza il protocollo HTTP 1.1 anziché 1.0. Allora mi sono detto: “non è che è tutto un problema di protocollo?!?”.
Prima di:
1 | header ("Content-type ..."); |
ho inserito la seguente riga:
1 | header ("HTTP/1.0 200 OK"); |
forzando così che la mia risposta sia in HTTP/1.0…e ha funzionato!!!
La mia spiegazione è questa: IE cerca (per motivi di sicurezza, dicono) di indentificare autonomamente il tipo di file, ignorando i Content-type e content-disposition vari che si mettono. Forzando il protocollo HTTP a 1.0 probabilmente IE si va a trovare in una modalità compatibile col vecchio protocollo, disabilitando le feature che normalmente utilizza col protocollo HTTP/1.1.
Bisogna stare attenti però all’output compression: il vostro server (Apache) potrebbe avere attivo mod_gzip, il che porterebbe a “g-zippare” tutto il suo output per risparmiare banda di rete. Purtroppo il “caro vecchio” IE6 ha un po’ di problemi a trattare gli header con output gzipped.
La soluzione è in questo caso aggiungere una riga
1 | apache_setenv("no-gzip","1"); |
al vostro script, prima di mandare in output il file da servire. Eventualmente verificate anche che sia disattivata la compressione gzip da PHP.
Per disattivarla occorre aggiungere
1 | ini_set("zlib.output_compression","Off"); |
Io ci sono impazzito 2 giorni su sta cosa…spero che possa essere d’aiuto a molti!


















3 Comments
1 Mar 10, 2009 at 16:38
Alex
Avevo lo stesso problema ma inserendo solamente:
header (“HTTP/1.0 200 OK”);
il risultato non cambiava…
ho dovuto inserire, sempre prima dell’ header content-type:
apache_setenv(“downgrade-1.0″, “true”);
apache_setenv(“force-response-1.0″, “true”);
header (“HTTP/1.0 200 OK”);
Ora è tutto perfetto
se non avessi letto il tuo articolo non avrei saputo da dove cominciare…
Grazie
Alex
2 May 22, 2009 at 7:55
Michele
Utilissimo l’articolo e la precisione di alex mi ha liberato dopo una giornata di ricerce
grazie 1000!
3 Jun 9, 2010 at 17:44
Giovanni Giuliano
grazie, sono riuscito a risolvere un problema moooolto grave
Leave a Comment