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.

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 comuniapplication/pdf— documenti PDF (.pdf)application/octet-stream— il tipo generico per dati binari sconosciuti o arbitraritext/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.

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.
