Các kiểu MIME thông dụng
Máy chủ và biểu mẫu tải lên dựa vào các chuỗi này; sai kiểu có thể làm hỏng xem trước, tải xuống hoặc CSP.
| Loại | Kiểu MIME | Phần mở rộng thường gặp |
|---|---|---|
| HTML | text/html | .html |
| CSS | text/css | .css |
| JavaScript | text/javascript | .js |
| JSON | application/json | .json |
| XML | application/xml | .xml |
| Văn bản thuần | text/plain | .txt |
| CSV | text/csv | .csv |
| application/pdf | ||
| ZIP | application/zip | .zip |
| PNG | image/png | .png |
| JPEG | image/jpeg | .jpg |
| GIF | image/gif | .gif |
| WebP | image/webp | .webp |
| SVG | image/svg+xml | .svg |
| ICO | image/x-icon | .ico |
| MP3 | audio/mpeg | .mp3 |
| WAV | audio/wav | .wav |
| MP4 | video/mp4 | .mp4 |
| WebM | video/webm | .webm |
| WOFF2 | font/woff2 | .woff2 |
| Biểu mẫu mã hóa URL | application/x-www-form-urlencoded | — |
| Biểu mẫu multipart | multipart/form-data | — |
Ghi chú
- Một số trình duyệt tự dò nội dung; máy chủ vẫn nên trả về kiểu chính xác.
- Kiểu chính thức của JS là text/javascript (application/javascript đã lỗi thời).
MIME type thực sự kiểm soát những gì
MIME type là nhãn mà máy chủ gắn vào phản hồi để báo cho trình duyệt biết các byte dữ liệu thuộc loại gì. text/html hiển thị trang, application/pdf mở trình đọc, image/svg+xml có thể được vẽ trực tiếp, và application/octet-stream kích hoạt hộp thoại tải xuống. Hai tệp trông giống hệt nhau có thể hoạt động hoàn toàn khác biệt dựa trên một header này. Trình duyệt, biểu mẫu tải lên, khách hàng email và quy tắc bảo mật nội dung đều đọc nó, vì vậy việc chọn sai là nguyên nhân phổ biến gây ra bản xem trước bị lỗi, buộc tải xuống và script bị chặn.
Văn bản/ và application/ được áp dụng ngày nay
Lời khuyên cũ nói JavaScript là application/javascript; tiêu chuẩn hiện tại là text/javascript và application/javascript đã lỗi thời. CSS là text/css, HTML là text/html, văn bản thô là text/plain và CSV là text/csv — tất cả đều là text/* vì chúng được thiết kế để con người có thể đọc được. Các định dạng có cấu trúc là application/*: application/json, application/xml, application/pdf, application/zip. Ngoại lệ đáng chú ý là SVG, vốn là XML nhưng phải được phục vụ dưới dạng image/svg+xml để trình duyệt hiển thị thay vì tải xuống.
Loại sai gây lỗi tải lên và vấn đề bảo mật
Một tệp tải lên bị gán nhãn sai là nguồn lỗi kinh điển: một tệp JSON được phục vụ dưới dạng text/plain có thể bị khách hàng API từ chối, ảnh trả về dưới dạng octet-stream sẽ tải xuống thay vì hiển thị, và script được phục vụ dưới dạng text/html bị trình duyệt chặn. Các quy tắc Content-Security-Policy nghiêm ngặt dựa vào MIME type, vì vậy một stylesheet được phục vụ với loại sai có thể bị từ chối hoàn toàn. Khi bản xem trước hoặc tải xuống hoạt động kỳ lạ, kiểm tra Content-Type của phản hồi thường là cách chẩn đoán nhanh nhất.
Charset và content sniffing
Đối với các loại văn bản, hãy kết hợp MIME type với charset — text/html; charset=utf-8 và application/json; charset=utf-8 là mặc định an toàn cho bất kỳ nội dung đa ngôn ngữ nào. Các trình duyệt cũer sử dụng content sniffing để đoán loại từ các byte của tệp, điều mà kẻ tấn công lợi dụng; việc gửi X-Content-Type-Options: nosniff nói với trình duyệt tin vào loại đã khai báo thay thế. Luôn gửi Content-Type rõ ràng và chính xác thay vì dựa vào phần mở rộng tệp, thứ mà trình duyệt không bao giờ thấy.
Đặt loại trên máy chủ và trong biểu mẫu
Nguồn gốc của loại quan trọng. Máy chủ tĩnh tự động ánh xạ phần mở rộng, nhưng các framework web thường cần đặt rõ ràng — trong Express bằng res.type('json'), trong Nginx qua khối types, và trên Cloudflare Pages qua headers hoặc phần mở rộng tệp. Biểu mẫu HTML sử dụng enctype để kiểm soát mã hóa tải lên: multipart/form-data cho tệp và application/x-www-form-urlencoded cho các trường văn bản thô, trong khi API mong đợi JSON gửi application/json. Gửi sai là nguồn âm thầm của mã 415 Unsupported Media Type và 400 khiến mọi thứ trông bí ẩn cho đến khi bạn kiểm tra header yêu cầu.
Các họ khác đáng ghi nhận
Ngoài các định dạng web thông dụng, một vài họ đáng được ghi nhận. Phông chữ dùng font/woff2 và font/ttf. Hình ảnh phân chia theo định dạng — image/jpeg, image/png, image/webp, image/avif, image/gif — trong khi âm thanh và video dùng audio/mpeg, audio/ogg, video/mp4 và video/webm. Nén và blob nhị phân là application/zip, application/gzip và application/octet-stream. Khi API trả về một tệp mà nó không thể xác định, octet-stream là câu trả lời trung thực: nó buộc khách hàng tải xuống thay vì đoán, đó chính xác là hành vi bạn muốn khi nội dung không rõ ràng.
Câu hỏi thường gặp
- Nên dùng kiểu MIME nào cho tệp .json?
- Dùng application/json cho tệp JSON và phản hồi API. Đây là kiểu chuẩn và nên trả về với UTF-8 khi có thể.
- Kiểu MIME của tệp .js là gì?
- Kiểu chính thức của JavaScript là text/javascript. Kiểu cũ application/javascript đã lỗi thời, không nên dùng nữa.
- Kiểu MIME của ảnh SVG là gì?
- Tệp SVG dùng image/svg+xml. Chỉ khi trả về đúng kiểu này trình duyệt mới hiển thị SVG nội tuyến.