← Tất cả công cụ

Tham Khảo Các Loại MIME

MIME types là gì, cách định dạng type/subtype hoạt động, tầm quan trọng của Content-Type trong HTTP và email, các loại phổ biến, và tại sao sai loại gây lỗi.
Phần mở rộngKiểu MIME

MIME type thực sự là gì

MIME type, còn gọi là media type, là một nhãn ngắn gọn cho phần mềm biết loại dữ liệu mà một tệp hoặc thân thông điệp chứa. Nó ra đời trong email (tên viết tắt của Multipurpose Internet Mail Extensions — Phần mở rộng thư điện tử đa mục đích) nhưng ngày nay xuất hiện ở khắp nơi trên web. Định dạng luôn là type/subtype: một danh mục rộng, một dấu gạch chéo, và một định dạng cụ thể. Vì vậy text/html nghĩa là "văn bản, ở dạng HTML", image/png nghĩa là "hình ảnh, ở dạng PNG", và application/json nghĩa là "dữ liệu ứng dụng, được mã hóa dưới dạng JSON".

Type cấp cao nhất đến từ một tập cố định do IANA duy trì, cơ quan đăng ký chính thức: text, image, audio, video, application, font, model, multipart, và một vài cái mới hơn như haptics. Subtype là định dạng cụ thể. Nhà cung cấp có thể thêm định dạng của mình với tiền tố vnd. (ví dụ application/vnd.ms-excel), và các kiểu thử nghiệm trong lịch sử dùng tiền tố x-, mặc dù quy ước đó hiện nay không được khuyến khích.

Các biểu tượng định dạng tệp phát sáng được sắp xếp vào các ô danh mục có nhãn trên nền chàm tối
Mỗi định dạng tệp ánh xạ tới một nhãn type/subtype.

MIME type quan trọng ở đâu

Nơi quan trọng nhất mà MIME type xuất hiện là header HTTP Content-Type trong phản hồi. Khi máy chủ gửi một trang, một hình ảnh hoặc dữ liệu API, header này cho trình duyệt biết cách diễn giải các byte. Nếu header nói text/html, trình duyệt sẽ hiển thị markup; nếu nói application/json, một lệnh gọi fetch() có thể phân tích cú pháp nó; nếu nói application/pdf, trình xem tích hợp sẽ mở. Header tương tự cũng đi kèm phía yêu cầu: khi bạn POST một form hoặc nội dung API, Content-Type cho máy chủ biết cách đọc những gì bạn gửi.

Ngoài HTTP, MIME type điều khiển nhiều hệ thống khác. Email client dùng chúng để quyết định xem tệp đính kèm là hình ảnh để xem trước hay tệp nhị phân để lưu. Trình xử lý tải tệp lên kiểm tra kiểu đã khai báo để chấp nhận hoặc từ chối tệp. Và hệ điều hành hoặc trình duyệt sử dụng kiểu này, không chỉ phần mở rộng tệp, để chọn ứng dụng mặc định. Ý tưởng tương tự còn nằm ở cách máy chủ báo cáo kết quả và lỗi cùng với mã trạng thái HTTP — một phản hồi 200 với kiểu sai có thể tệ không kém một phản hồi 404.

Những MIME type bạn dùng hàng ngày

Một số kiểu chiếm phần lớn lưu lượng thực tế:

  • text/html — trang web (phần mở rộng .html)
  • text/css — stylesheet (.css)
  • text/javascript — kiểu được khuyến nghị cho JavaScript (.js, .mjs)
  • application/json — kiểu JSON chính thức duy nhất, được định nghĩa trong RFC 8259 (.json)
  • image/png, image/jpeg, image/webp, image/svg+xml — các định dạng hình ảnh phổ biến
  • application/pdf — tài liệu PDF (.pdf)
  • application/octet-stream — kiểu dự phòng cho dữ liệu nhị phân tùy ý không xác định
  • text/plain — mặc định cho văn bản thuần túy không có kiểu phong phú hơn

JSON đáng được lưu ý vì nó khiến nhiều người nhầm lẫn. Kiểu duy nhất đúng là application/json. Code cũ đôi khi dùng text/json, text/plain, hoặc application/x-javascript, nhưng những cái đó đã lỗi thời và một số client sẽ từ chối phân tích cú pháp chúng. Cũng không có tham số charset cho JSON — đặc tả yêu cầu UTF-8, vì vậy viết application/json; charset=utf-8 là thừa, dù không gây hại. Để xem bảng đầy đủ hơn về định dạng và phần mở rộng, hãy xem bảng tham chiếu của chúng tôi.

Một gói dữ liệu phát sáng được gắn nhãn kiểu trừu tượng đang chạy qua kết nối mạng
Content-Type đi kèm với dữ liệu qua HTTP.

Tại sao Content-Type sai làm hỏng mọi thứ

Trình duyệt và client tin tưởng vào kiểu đã khai báo, vì vậy đặt sai có những hậu quả cụ thể. Phục vụ phản hồi JSON API dưới dạng text/html và trình duyệt có thể cố gắng hiển thị nó, hoặc một client nghiêm ngặt có thể báo lỗi phân tích cú pháp trước khi code của bạn chạy. Phục vụ tệp CSS hoặc JavaScript với kiểu sai và một tính năng bảo mật gọi là X-Content-Type-Options: nosniff sẽ khiến trình duyệt từ chối áp dụng nó, âm thầm làm hỏng kiểu dáng trang hoặc script của bạn.

Tải xuống là trường hợp thất bại điển hình khác. Nếu bạn muốn một tệp được tải xuống thay vì hiển thị, kiểu quan trọng cùng với header Content-Disposition. PDF được gửi dưới dạng application/octet-stream sẽ tải xuống như tệp thông thường thay vì mở trong trình xem; hình ảnh được gửi dưới dạng text/plain hiển thị như các ký tự vô nghĩa. Về phía tải lên, tệp gán nhãn sai có thể vượt qua kiểm tra phần mở rộng ngây thơ, đó là lý do tại sao bộ xác thực mạnh mẽ kiểm tra các byte thực (số "magic") thay vì tin vào kiểu do client cung cấp.

Trong lịch sử, trình duyệt cố gắng đoán, hay "sniff" (đánh hơi), kiểu thực sự khi header có vẻ sai. Hành vi đó gây ra lỗ hổng bảo mật, vì vậy thực hành tốt nhất hiện đại là luôn gửi Content-Type chính xác và tắt sniff bằng nosniff. Tóm lại: đặt kiểu một cách có chủ đích trên mỗi phản hồi, và hầu hết các lỗi hiển thị, tải xuống và phân tích cú pháp sẽ biến mất.

Các câu hỏi thường gặp

Sự khác biệt giữa MIME type và media type là gì?

Chúng là một. "MIME type" là tên cũ từ email, trong khi "media type" là thuật ngữ mà IANA và các đặc tả HTTP hiện đại ưu tiên. Cả hai đều chỉ nhãn type/subtype.

MIME type đúng cho JSON là gì?

Là application/json, được định nghĩa trong RFC 8259. Các phương án cũ như text/json hoặc application/x-javascript đã lỗi thời và một số client sẽ từ chối chúng.

application/octet-stream nghĩa là gì?

Đây là kiểu chung cho dữ liệu nhị phân tùy ý không có nhãn cụ thể hơn. Máy chủ dùng nó làm dự phòng cho các loại tệp không xác định, thường kích hoạt tải xuống thay vì hiển thị trong trình duyệt.

Tại sao tệp CSS hoặc JavaScript của tôi không tải?

Thường là máy chủ gửi nó với Content-Type sai. Với X-Content-Type-Options được đặt thành nosniff, trình duyệt từ chối áp dụng CSS không phải text/css hoặc script không phải kiểu JavaScript. Hãy sửa cấu hình máy chủ để gửi đúng kiểu.

Tôi có thể thêm charset vào MIME type không?

Có, cho các định dạng văn bản, dùng tham số như text/html; charset=utf-8. Với JSON thì không cần vì định dạng luôn là UTF-8 theo đặc tả, dù thêm vào cũng không gây hại.

Phần mở rộng tệp có xác định MIME type không?

Không qua HTTP. Máy chủ quyết định Content-Type nào sẽ gửi, và trình duyệt tin vào header đó. Phần mở rộng chỉ đóng vai trò gợi ý cho các công cụ và hệ điều hành khi không có kiểu rõ ràng nào được cung cấp.