Sis srl

Ciarpame {.com}

Useful stuffs for the masses. Useless things for few.

October 13th, 2008

IE 6: header Content-disposition ignorati (ignored) !!FIXED!!

by Daniele Veratti

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!

Tags: · , ,
Categories: Programming

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