← ყველა ხელსაწყო

MIME ტიპების საცნობარო

რა არის MIME ტიპები, როგორ მუშაობს type/subtype ფორმატი, სად აქვს მნიშვნელობა Content-Type-ს HTTP-სა და ელფოსტაში, გავრცელებული ტიპები და შეცდომების შედეგები.
გაფართოებაMIME ტიპი

რა არის MIME ტიპი სინამდვილეში

MIME ტიპი, ასევე წოდებული მედია ტიპად, არის მოკლე ჭდე, რომელიც პროგრამულ უზრუნველყოფას ეუბნება, რა სახის მონაცემია ფაილში ან შეტყობინების შიგთავსში. ის ელფოსტაში დაიბადა (სახელი ნიშნავს Multipurpose Internet Mail Extensions), მაგრამ დღეს ვებში ყველგან ჩნდება. ფორმატი ყოველთვის ასეთია: type/subtype — ფართო კატეგორია, ხაზი და კონკრეტული ფორმატი. ასე რომ text/html ნიშნავს „ტექსტი, HTML ფორმატში", image/png ნიშნავს „სურათი, PNG ფორმატში", ხოლო application/json ნიშნავს „აპლიკაციური მონაცემები, JSON ფორმატში კოდირებული".

ზედა დონის ტიპი ფიქსირებული ნაკრებიდან მოდის, რომელსაც IANA, ოფიციალური რეესტრი, უზრუნველყოფს: text, image, audio, video, application, font, model, multipart და რამდენიმე ახალი, როგორიცაა haptics. ქვეტიპი კონკრეტული ფორმატია. მომწოდებლებს შეუძლიათ საკუთარის დამატება vnd. პრეფიქსით (მაგალითად application/vnd.ms-excel), ხოლო ექსპერიმენტული ტიპები ისტორიულად იყენებდნენ x- პრეფიქსს, თუმცა ეს პრაქტიკა ახლა არ არის რეკომენდებული.

აბსტრაქტული ციალა ფაილის ფორმატის ხატულები, დალაგებული ჭდიან კატეგორიის ფილებში მუქ ინდიგოსფერ ფონზე
ყოველი ფაილის ფორმატი შეესაბამება type/subtype ჭდეს.

სად აქვს MIME ტიპებს მნიშვნელობა

ერთადერთი ყველაზე მნიშვნელოვანი ადგილი, სადაც MIME ტიპი ჩნდება, არის HTTP Content-Type პასუხის სათაური. როცა სერვერი გვერდს, სურათს ან API-ის შიგთავსს აგზავნის, ეს სათაური ბრაუზერს ეუბნება, როგორ განმარტოს ბაიტები. თუ სათაურში წერია text/html, ბრაუზერი მარკირებას რენდერავს; თუ წერია application/json, fetch() ზარს შეუძლია მისი დამუშავება; თუ წერია application/pdf, ეხსნება ჩაშენებული მაჩვენებელი. იგივე სათაური მოთხოვნის მხარესაც გადის: როცა ფორმას ან API-ის შიგთავსს POST-ავთ, Content-Type სერვერს ეუბნება, როგორ წაიკითხოს გამოგზავნილი.

HTTP-ის მიღმა, MIME ტიპები რამდენიმე სხვა სისტემასაც განაპირობებს. ელფოსტის კლიენტები მათ იყენებენ იმის გადასაწყვეტად, არის თუ არა თანდართული ფაილი გადასახედი სურათი, თუ შესანახი ორობითი ფაილი. ფაილის ატვირთვის დამმუშავებლები დეკლარირებულ ტიპს ამოწმებენ ფაილის მისაღებად ან უარსაყოფად. ხოლო ოპერაციული სისტემა ან ბრაუზერი ტიპს იყენებს, არა მხოლოდ ფაილის გაფართოებას, ნაგულისხმევი აპლიკაციის ასარჩევად. იგივე იდეა უდევს საფუძვლად იმას, თუ როგორ ატყობინებენ სერვერები შედეგებსა და შეცდომებს HTTP სტატუს-კოდებთან ერთად — 200 პასუხი არასწორი ტიპით ისეთივე გაფუჭებული შეიძლება იყოს, როგორც 404.

ის, რასაც ყოველდღე გამოიყენებთ

რამდენიმე ტიპი ფარავს რეალური ტრაფიკის აბსოლუტურ უმრავლესობას:

  • text/html — ვებ გვერდები (გაფართოება .html)
  • text/css — სტილის ცხრილები (.css)
  • text/javascript — რეკომენდებული ტიპი JavaScript-ისთვის (.js, .mjs)
  • application/json — ერთადერთი ოფიციალური JSON ტიპი, განსაზღვრული RFC 8259-ში (.json)
  • image/png, image/jpeg, image/webp, image/svg+xml — გავრცელებული სურათის ფორმატები
  • application/pdf — PDF დოკუმენტები (.pdf)
  • application/octet-stream — უნივერსალური ტიპი უცნობი ან თვითნებური ორობითი მონაცემისთვის
  • text/plain — ნაგულისხმევი ტიპი უბრალო ტექსტისთვის, რომელსაც უფრო კონკრეტული ტიპი არ აქვს

JSON ცალკე შენიშვნას იმსახურებს, რადგან ხშირად ბნევს ხალხს. ერთადერთი სწორი ტიპია application/json. ძველი კოდი ხანდახან იყენებდა text/json-ს, text/plain-ს ან application/x-javascript-ს, მაგრამ ესენი მოძველებულია და ზოგიერთი კლიენტი მათ დამუშავებაზე უარს ამბობს. JSON-ს charset პარამეტრიც არ სჭირდება — სპეციფიკაცია UTF-8-ს ავალდებულებს, ამიტომ application/json; charset=utf-8-ის ჩაწერა ზედმეტია, თუმცა ზიანს არ აყენებს. ფორმატებისა და გაფართოებების უფრო სრული ცხრილისთვის იხილეთ ჩვენი საცნობარო ცხრილები.

ციალა მონაცემთა პაკეტი, მონიშნული აბსტრაქტული ტიპის ნიშნით, ქსელურ კავშირზე მიედინება
Content-Type შიგთავსთან ერთად HTTP-ზე მოძრაობს.

რატომ ანგრევს არასწორი Content-Type ყველაფერს

ბრაუზერები და კლიენტები დეკლარირებულ ტიპს ენდობიან, ამიტომ მისი არასწორად მითითება კონკრეტულ შედეგებამდე მიდის. JSON API-ის პასუხის text/html-ად გაგზავნა ბრაუზერს აიძულებს, სცადოს მისი რენდერი, ან მკაცრი კლიენტი დამუშავების შეცდომას გამოიტანს, სანამ თქვენი კოდი საერთოდ გაეშვება. CSS ან JavaScript ფაილის არასწორი ტიპით გაგზავნა კი უსაფრთხოების ფუნქციას, სახელად X-Content-Type-Options: nosniff, ბრაუზერს აიძულებს, უარი თქვას მის გამოყენებაზე, ჩუმად რაც ანგრევს გვერდის სტილს ან სკრიპტებს.

ჩამოტვირთვები კიდევ ერთი კლასიკური ჩავარდნის მიზეზია. თუ გსურთ, ფაილი ჩამოიტვირთოს ნაცვლად იმისა, რომ ჩაჩნდეს, ტიპს Content-Disposition სათაურთან ერთად აქვს მნიშვნელობა. PDF, გაგზავნილი როგორც application/octet-stream, ჩამოიტვირთება ზოგადი ფაილის სახით, ნაცვლად იმისა, რომ მაჩვენებელში გაიხსნას; სურათი, გაგზავნილი როგორც text/plain, ხაზგარეშე სიმბოლოებად ჩნდება. ატვირთვის მხარეს, არასწორად მონიშნულ ფაილს ხშირად გვერდი აქვს გვერდზე გაუვლელი გაფართოების უბრალო შემოწმებისთვის, რის გამოც სანდო შემმოწმებლები რეალურ ბაიტებს ამოწმებენ (ე.წ. „მაგიური რიცხვი"), ვიდრე კლიენტის მითითებულ ტიპს ენდობიან.

ისტორიულად, ბრაუზერები ცდილობდნენ „ყნოსვით" გამოეცნოთ ნამდვილი ტიპი, როცა სათაური მცდარი ჩანდა. ამ ქცევამ უსაფრთხოების ხვრელები გამოიწვია, ამიტომ თანამედროვე საუკეთესო პრაქტიკა მუდამ ზუსტი Content-Type-ის გაგზავნასა და nosniff-ით ყნოსვის გამორთვას ითვალისწინებს. მოკლედ: დააყენეთ ტიპი შეგნებულად ყოველ პასუხზე, და რენდერის, ჩამოტვირთვისა და დამუშავების უმეტესი ხარვეზი გაქრება.

ხშირად დასმული კითხვები

რა განსხვავებაა MIME ტიპსა და მედია ტიპს შორის?

ეს ერთი და იგივეა. „MIME ტიპი" უფრო ძველი სახელია ელფოსტიდან, ხოლო „მედია ტიპი" ტერმინია, რომელსაც IANA და თანამედროვე HTTP სპეციფიკაციები ამჯობინებენ. ორივე type/subtype ჭდეს გულისხმობს.

რომელია სწორი MIME ტიპი JSON-ისთვის?

ეს არის application/json, განსაზღვრული RFC 8259-ში. უფრო ძველი ალტერნატივები, როგორიცაა text/json ან application/x-javascript, მოძველებულია და ზოგიერთი კლიენტი მათ უარყოფს.

რას ნიშნავს application/octet-stream?

ეს არის უნივერსალური ტიპი თვითნებური ორობითი მონაცემისთვის, რომელსაც უფრო კონკრეტული ჭდე არ აქვს. სერვერები მას სათადარიგოდ იყენებენ უცნობი ფაილის ტიპებისთვის, რაც ჩვეულებრივ ჩამოტვირთვას იწვევს ბრაუზერში ჩვენების ნაცვლად.

რატომ არ იტვირთება ჩემი CSS ან JavaScript ფაილი?

ხშირად სერვერი მას არასწორი Content-Type-ით აგზავნის. როცა X-Content-Type-Options დაყენებულია nosniff-ზე, ბრაუზერი უარს ამბობს CSS-ის გამოყენებაზე, რომელიც text/css არ არის, ან სკრიპტისა, რომელიც JavaScript ტიპი არ არის. გამოასწორეთ სერვერის კონფიგურაცია, რომ სწორი ტიპი იგზავნებოდეს.

შემიძლია MIME ტიპს charset დავამატო?

დიახ, ტექსტური ფორმატებისთვის, პარამეტრის გამოყენებით, როგორიცაა text/html; charset=utf-8. JSON-ისთვის ეს ზედმეტია, რადგან ფორმატი სპეციფიკაციით ყოველთვის UTF-8-ია, თუმცა მისი დამატება ზიანს არ აყენებს.

განსაზღვრავს ფაილის გაფართოება MIME ტიპს?

HTTP-ზე — არა. სერვერი წყვეტს, რომელი Content-Type გაუგზავნოს, ხოლო ბრაუზერი ამ სათაურს ენდობა. გაფართოება მხოლოდ მინიშნებას იძლევა ხელსაწყოებისა და ოპერაციული სისტემებისთვის, როცა ცხადი ტიპი მითითებული არ არის.