← Tutti gli strumenti

Riferimento Tipi MIME

Cosa sono i tipi MIME, come funziona il formato type/subtype, dove conta il Content-Type in HTTP e nelle email, i tipi più comuni e perché uno sbagliato causa problemi.
EstensioneTipo MIME

Cos'è davvero un tipo MIME

Un tipo MIME, detto anche media type, è una breve etichetta che indica al software che tipo di dati contiene un file o il corpo di un messaggio. È nato nell'email (il nome sta per Multipurpose Internet Mail Extensions) ma oggi compare ovunque sul web. Il formato è sempre tipo/sottotipo: una categoria ampia, una barra, e un formato specifico. Quindi text/html significa "testo, in formato HTML", image/png significa "un'immagine, in formato PNG", e application/json significa "dati applicativi, codificati in JSON".

Il tipo di primo livello proviene da un insieme fisso mantenuto dall'IANA, il registro ufficiale: text, image, audio, video, application, font, model, multipart, e alcuni più recenti come haptics. Il sottotipo è il formato specifico. I produttori possono aggiungerne di propri con il prefisso vnd. (ad esempio application/vnd.ms-excel), e i tipi sperimentali storicamente usavano il prefisso x-, anche se questa convenzione è ormai sconsigliata.

Icone di formato file luminose astratte ordinate in riquadri etichettati su uno sfondo indaco scuro
Ogni formato di file corrisponde a un'etichetta tipo/sottotipo.

Dove contano i tipi MIME

Il posto più importante in cui compare un tipo MIME è l'intestazione HTTP Content-Type della risposta. Quando un server invia una pagina, un'immagine o un payload API, questa intestazione dice al browser come interpretare i byte. Se l'intestazione dice text/html, il browser esegue il rendering del markup; se dice application/json, una chiamata fetch() può analizzarla; se dice application/pdf, si apre il visualizzatore integrato. La stessa intestazione viaggia anche nella richiesta: quando si effettua il POST di un modulo o di un corpo API, Content-Type indica al server come leggere ciò che è stato inviato.

Oltre a HTTP, i tipi MIME guidano diversi altri sistemi. I client di posta elettronica li usano per decidere se un allegato è un'immagine da visualizzare in anteprima o un file binario da salvare. I gestori di caricamento file ispezionano il tipo dichiarato per accettare o rifiutare i file. E il sistema operativo o il browser usa il tipo, non solo l'estensione del file, per scegliere un'applicazione predefinita. La stessa idea è alla base di come i server riportano risultati ed errori insieme ai codici di stato HTTP — una risposta 200 con il tipo errato può essere altrettanto problematica di un 404.

Quelli che userai ogni giorno

Una manciata di tipi copre la grande maggioranza del traffico reale:

  • text/html — pagine web (estensione .html)
  • text/css — fogli di stile (.css)
  • text/javascript — il tipo raccomandato per JavaScript (.js, .mjs)
  • application/json — l'unico tipo JSON ufficiale, definito nell'RFC 8259 (.json)
  • image/png, image/jpeg, image/webp, image/svg+xml — formati immagine comuni
  • application/pdf — documenti PDF (.pdf)
  • application/octet-stream — il tipo generico per dati binari sconosciuti o arbitrari
  • text/plain — il tipo predefinito per il testo normale privo di un tipo più specifico

Il JSON merita una nota perché crea spesso confusione. L'unico tipo corretto è application/json. Il codice più vecchio a volte usava text/json, text/plain o application/x-javascript, ma questi sono obsoleti e alcuni client si rifiuteranno di analizzarli. Non esiste nemmeno un parametro charset per JSON — la specifica impone UTF-8, quindi scrivere application/json; charset=utf-8 è ridondante anche se innocuo. Per una tabella più completa di formati ed estensioni, consulta le nostre tabelle di riferimento.

Un pacchetto dati luminoso etichettato con un badge di tipo astratto che scorre su una connessione di rete
Il Content-Type viaggia con il payload attraverso HTTP.

Perché un Content-Type errato rompe le cose

Browser e client si fidano del tipo dichiarato, quindi sbagliarlo ha conseguenze concrete. Servire una risposta API JSON come text/html e il browser potrebbe tentare di eseguirne il rendering, oppure un client rigoroso potrebbe generare un errore di analisi prima che il codice venga eseguito. Servire un file CSS o JavaScript con il tipo sbagliato e una funzione di sicurezza chiamata X-Content-Type-Options: nosniff farà sì che il browser si rifiuti di applicarlo, interrompendo silenziosamente lo stile della pagina o gli script.

I download sono l'altro classico punto critico. Se si vuole che un file venga scaricato piuttosto che visualizzato, il tipo conta insieme all'intestazione Content-Disposition. Un PDF inviato come application/octet-stream viene scaricato come file generico invece di aprirsi nel visualizzatore; un'immagine inviata come text/plain appare come caratteri incomprensibili. Dal lato del caricamento, un file con un'etichetta errata può superare un controllo di estensione superficiale, motivo per cui i validatori robusti ispezionano i byte reali (il "numero magico") piuttosto che fidarsi del tipo fornito dal client.

Storicamente, i browser tentavano di indovinare, o "annusare", il tipo reale quando l'intestazione sembrava errata. Questo comportamento causava falle di sicurezza, quindi la moderna buona pratica è inviare sempre un Content-Type accurato e disabilitare lo sniffing con nosniff. In breve: imposta il tipo deliberatamente in ogni risposta e la maggior parte dei bug di rendering, download e analisi scomparirà.

Domande frequenti

Qual è la differenza tra tipo MIME e media type?

Sono la stessa cosa. "Tipo MIME" è il nome più vecchio derivato dall'email, mentre "media type" è il termine preferito dall'IANA e dalle moderne specifiche HTTP. Entrambi si riferiscono all'etichetta tipo/sottotipo.

Qual è il tipo MIME corretto per JSON?

È application/json, definito nell'RFC 8259. Le alternative più vecchie come text/json o application/x-javascript sono obsolete e alcuni client le rifiuteranno.

Cosa significa application/octet-stream?

È il tipo generico per dati binari arbitrari privi di un'etichetta più specifica. I server lo usano come fallback per i tipi di file sconosciuti, il che di solito attiva un download piuttosto che la visualizzazione nel browser.

Perché il mio file CSS o JavaScript non si carica?

Spesso il server lo invia con il Content-Type errato. Con X-Content-Type-Options impostato su nosniff, il browser si rifiuta di applicare CSS che non sia text/css o script che non siano di tipo JavaScript. Correggi la configurazione del server in modo che venga inviato il tipo corretto.

Posso aggiungere un charset a un tipo MIME?

Sì, per i formati di testo, usando un parametro come text/html; charset=utf-8. Per JSON non è necessario perché il formato è sempre UTF-8 per specifica, anche se aggiungerlo non crea problemi.

L'estensione del file determina il tipo MIME?

Non tramite HTTP. Il server decide quale Content-Type inviare, e il browser si fida di quell'intestazione. L'estensione funge solo da suggerimento per strumenti e sistemi operativi quando non viene fornito un tipo esplicito.