MIME Types: Nginx, Apache, and Caddy Configuration

Configure MIME types in Nginx, Apache, and Caddy. Covers AVIF, WASM, WOFF2, how to test with curl, and common server misconfigurations.

ZERO UPLOAD · ALL LOCAL
  1. Type a MIME string (e.g. application/json), file extension (e.g. .wasm), or keyword (e.g. "protobuf") to search the database.
  2. Use the category pills (Application, Audio, Font, Image, Model, Text, Video, Multipart) to browse all types in a category.
  3. Click Details on any card to expand the description, spec link, and server configuration snippets in a full-width panel.
  4. Click Copy next to any snippet block to copy the Nginx, Apache, .htaccess, or Caddy directive to your clipboard.

Types that need explicit server config

  • missing from Nginx 1.17 and older
  • missing from most server defaults shipped before 2019
  • absent from Apache's default MIME database until recently

Browsers enforce these strictly: a wrong application/wasm type throws a hard compile-time error, while a wrong font MIME type fails silently with no console message.

APPLICATION (100 types)

application/json
.json
application/xml
.xml .xsl .xslt
application/pdf
.pdf
application/wasm
.wasm
application/javascript
.js .mjs .cjs
application/zip
.zip
application/gzip
.gz .tgz
application/x-tar
.tar
application/x-7z-compressed
.7z
application/vnd.rar
.rar
application/x-bzip2
.bz2
application/vnd.openxmlformats-officedocument.wordprocessingml.document
.docx
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
.xlsx
application/vnd.openxmlformats-officedocument.presentationml.presentation
.pptx
application/msword
.doc
application/vnd.ms-excel
.xls
application/vnd.ms-powerpoint
.ppt
application/octet-stream
.bin .exe .dll
application/x-www-form-urlencoded
application/cbor
.cbor
application/x-protobuf
.proto .pb
application/grpc
application/graphql-response+json
application/vnd.api+json
application/ld+json
.jsonld
application/hal+json
application/jwt
application/manifest+json
.webmanifest
application/rtf
.rtf
application/problem+json
application/json-patch+json
application/merge-patch+json
application/vnd.geo+json
.geojson
application/yaml
.yaml .yml
application/sql
.sql
application/epub+zip
.epub
application/java-archive
.jar
application/vnd.oasis.opendocument.text
.odt
application/vnd.oasis.opendocument.spreadsheet
.ods
application/vnd.oasis.opendocument.presentation
.odp
application/x-ndjson
.ndjson .jsonl
application/vnd.apple.mpegurl
.m3u8
application/dash+xml
.mpd
application/rss+xml
.rss
application/atom+xml
.atom
application/x-apple-diskimage
.dmg
application/x-debian-package
.deb
application/x-rpm
.rpm
application/x-sh
.sh
application/ecmascript
application/toml
.toml
application/zstd
.zst
application/x-xz
.xz
application/x-bzip
.bz
application/x-lzma
.lzma
application/x-iso9660-image
.iso
application/vnd.ms-cab-compressed
.cab
application/vnd.android.package-archive
.apk
application/x-msdownload
.msi
application/vnd.apple.installer+xml
.mpkg
application/x-httpd-cgi
.cgi
application/vnd.google-earth.kml+xml
.kml
application/vnd.google-earth.kmz
.kmz
application/vnd.sqlite3
.sqlite .sqlite3 .db
application/msgpack
.msgpack
application/schema+json
application/wsdl+xml
.wsdl
application/jose+json
application/x-pkcs12
.p12 .pfx
application/pkix-cert
.cer .der
application/x-pem-file
.pem .crt .key
application/pkcs8
.p8
application/pkcs10
.p10 .csr
application/postscript
.ps .eps .ai
application/x-latex
.latex .ltx
application/x-tex
.tex
application/x-dvi
.dvi
application/fits
.fits .fit .fts
application/vnd.oasis.opendocument.graphics
.odg
application/vnd.oasis.opendocument.chart
.odc
application/vnd.oasis.opendocument.formula
.odf
application/vnd.ms-project
.mpp .mpt
application/vnd.visio
.vsd .vst .vss .vsw
application/vnd.ms-access
.mdb
application/vnd.openxmlformats-officedocument.wordprocessingml.template
.dotx
application/vnd.ms-word.document.macroenabled.12
.docm
application/vnd.ms-excel.sheet.macroenabled.12
.xlsm
application/vnd.apple.pages
.pages
application/vnd.apple.numbers
.numbers
application/vnd.apple.keynote
.key
application/typescript
.ts
application/x-perl
.pl .pm
application/x-python-code
.pyc .pyo
application/x-csh
.csh
application/x-troff
.tr .roff .man
application/trig
.trig
application/n-triples
.nt
application/smil+xml
.smil .smi
application/vnd.mozilla.xul+xml
.xul
application/vnd.lotus-1-2-3
.123 .wks

AUDIO (23 types)

audio/mpeg
.mp3 .mpga
audio/ogg
.ogg .oga
audio/wav
.wav
audio/flac
.flac
audio/aac
.aac
audio/opus
.opus
audio/webm
.weba
audio/midi
.mid .midi
audio/mp4
.m4a .m4b .mp4a
audio/3gpp
.3gp .3gpp
audio/aiff
.aif .aiff
audio/x-ms-wma
.wma
audio/amr
.amr
audio/speex
.spx
audio/ac3
.ac3
audio/vorbis
audio/basic
.au .snd
audio/x-caf
.caf
audio/mpegurl
.m3u
audio/vnd.dts
.dts
audio/mp2
.mp2
audio/3gpp2
.3g2
audio/x-realaudio
.ra .ram

FONT (10 types)

font/woff
.woff
font/woff2
.woff2
font/ttf
.ttf
font/otf
.otf
application/vnd.ms-fontobject
.eot
font/collection
.ttc
font/sfnt
.sfnt
application/x-font-truetype
.ttf
application/x-font-opentype
.otf
application/x-font-woff
.woff

IMAGE (35 types)

image/jpeg
.jpg .jpeg .jfif
image/png
.png
image/gif
.gif
image/webp
.webp
image/avif
.avif
image/svg+xml
.svg .svgz
image/vnd.microsoft.icon
.ico
image/x-icon
.ico
image/bmp
.bmp
image/tiff
.tiff .tif
image/heic
.heic
image/heif
.heif
image/apng
.apng
image/jxl
.jxl
image/jp2
.jp2 .j2k .jpf
image/jpx
.jpx
image/vnd.djvu
.djvu .djv
image/vnd.adobe.photoshop
.psd
image/x-portable-bitmap
.pbm
image/x-portable-graymap
.pgm
image/x-portable-pixmap
.ppm
image/x-xcf
.xcf
image/ktx
.ktx
image/ktx2
.ktx2
image/x-exr
.exr
image/x-rgb
.rgb .rgba .sgi
image/x-xbitmap
.xbm
image/x-pcx
.pcx
image/vnd.wap.wbmp
.wbmp
image/x-tga
.tga .tpic
image/vnd.ms-photo
.jxr .hdp .wdp
image/x-win-bitmap
.cur
image/x-emf
.emf
image/wmf
.wmf
image/vnd.radiance
.hdr .rgbe

MODEL (19 types)

model/gltf+json
.gltf
model/gltf-binary
.glb
model/obj
.obj
model/stl
.stl
model/usd
.usd .usda .usdc
model/vnd.collada+xml
.dae
model/vnd.usdz+zip
.usdz
model/mtl
.mtl
model/vnd.dwf
.dwf
model/iges
.igs .iges
model/step
.stp .step .p21
model/step+xml
.stpx .stpxz
model/x3d+xml
.x3d
model/x3d+binary
.x3db .x3dbz
model/x3d-vrml
.x3dv .x3dvz
model/vnd.3mf
.3mf
model/vnd.fbx
.fbx
model/vnd.opengex
.ogex
model/JT
.jt

TEXT (33 types)

text/html
.html .htm
text/css
.css
text/csv
.csv
text/plain
.txt .text .conf .log
text/markdown
.md .markdown
text/calendar
.ics .ical .ifb
text/vcard
.vcf .vcard
text/javascript
.js
text/event-stream
text/tab-separated-values
.tsv
text/xml
.xml
text/x-python
.py .pyw
text/x-java-source
.java
text/x-c
.c .h
text/x-ruby
.rb
text/x-go
.go
text/x-rust
.rs
text/x-kotlin
.kt .kts
text/x-swift
.swift
text/x-scala
.scala .sc
text/x-php
.php .php3 .php4 .php5 .phtml
text/x-diff
.diff .patch
text/uri-list
.uri .urls .uris
text/x-rst
.rst
text/x-asciidoc
.adoc .asciidoc
text/x-nfo
.nfo
text/x-asm
.asm .s
text/troff
.roff .me .ms .mm
text/x-ini
.ini .cfg .inf
text/x-tcl
.tcl .tk
text/x-fortran
.f .f90 .for .f95
text/x-yaml
.yaml .yml
text/cache-manifest
.appcache .manifest

VIDEO (21 types)

video/mp4
.mp4 .m4v
video/webm
.webm
video/ogg
.ogv
video/x-msvideo
.avi
video/quicktime
.mov .qt
video/x-matroska
.mkv .mk3d
video/mp2t
.ts .mts .m2ts
video/mpeg
.mpeg .mpg
video/3gpp
.3gp .3gpp
video/3gpp2
.3g2 .3gp2
video/x-ms-wmv
.wmv
video/x-ms-asf
.asf .asx
video/vnd.avi
.avi
video/iso.segment
.m4s
video/x-dv
.dv .dif
video/x-ms-vob
.vob
video/H264
video/H265
video/AV1
video/x-flv
.flv
video/x-f4v
.f4v

MULTIPART (9 types)

multipart/form-data
multipart/byteranges
multipart/mixed
multipart/alternative
multipart/digest
multipart/related
multipart/signed
multipart/encrypted
multipart/report
No MIME types match your search.

MIME Types: Nginx, Apache, and Caddy Server Configuration Guide

Server MIME type configuration controls what Content-Type header every file gets. When a web server delivers a file, the Content-Type response header tells the browser how to handle it: render the content, execute it as a script, or trigger a download. Most servers ship with a built-in MIME type table covering common formats, but newer formats added after the type database was last updated require explicit configuration. AVIF images, WebAssembly modules, and WOFF2 fonts all require manual entries on many server versions.1 Missing or wrong MIME types cause real failures: browsers refuse to execute WebAssembly served without application/wasm, reject cross-origin fonts with incorrect types, and may refuse JavaScript under strict CSP. Testing your configuration with curl before deployment catches mismatches before they reach production users.

Types that need explicit server configuration

Most servers ship with MIME type tables written years before modern formats existed, which means the bundled configuration files that ship with Nginx, Apache, and Caddy reflect the web format landscape of a decade ago rather than today.2 Nginx's bundled mime.types file, Apache's mime.types database, and Caddy's built-in defaults all cover JPEG, PNG, HTML, CSS, and JSON. Yet several widely-used formats are absent from older installs. AVIF images (image/avif) require an explicit entry in Nginx 1.17 and older. WebAssembly files (application/wasm) are missing from most server defaults shipped before 2019. WOFF2 fonts (font/woff2) were absent from Apache's default MIME database until recently.

Strict browser enforcement for modern formats

Furthermore, browser enforcement for these types is strict: application/wasm triggers a hard compile-time error if wrong, while incorrect font MIME types produce silent failures with no browser error message. Building on this, a post-deployment curl audit is the only reliable way to confirm all types are configured correctly. Run curl -sI against representative URLs for each format your server delivers, and compare every Content-Type response header against the expected IANA-registered value. Automating this check in a deployment pipeline catches regressions before they reach production users.

Testing MIME headers with curl

Verifying MIME type headers requires an HTTP response, not a file system check. Run curl -sI https://example.com/assets/app.wasm and read the Content-Type line in the response headers. The -I flag sends a HEAD request, returning only headers without downloading the file body. For local development, run curl -sI http://localhost:3000/path/to/file.avif. Checking several file types in sequence is faster with individual HEAD requests per extension: request one representative file of each format and inspect its Content-Type. Conversely, browser developer tools show Content-Type in the Network panel, but you need a page that actively loads the file, making curl more reliable for systematic auditing. Record the expected and actual Content-Type for each format in a checklist before signing off on a new server configuration.

Common misconfigurations and detection

Three misconfigurations appear across all server types. The first is serving WASM files as application/octet-stream. This happens when the server's MIME table has no application/wasm entry, and the server falls back to its default binary type. Browsers reject this with a hard error. The second is serving AVIF images as application/octet-stream rather than image/avif. The third is serving WOFF2 fonts as application/octet-stream rather than font/woff2. Furthermore, WOFF2 loaded cross-origin requires both the correct MIME type and an Access-Control-Allow-Origin header. Browsers fail silently on incorrect font MIME types: no console error appears, the font simply fails to load and the page uses its CSS fallback. Detecting this requires checking the Network panel for the font request status and Content-Type value.

Caddy v2 MIME type configuration with the header directive

Caddy v2 ships with a built-in MIME type table that covers common formats.3 For newer formats absent from the built-in table, the header directive in a Caddyfile overrides Content-Type on matching responses without touching the global type table. Caddy's named path matchers let you scope each override to requests ending with a specific extension: the declaration @avif { path *.avif } defines a named matcher that a subsequent header directive references.

A complete Caddy override for AVIF and WebAssembly looks like this: define matchers using the @ prefix, then pair each matcher with header @matcher Content-Type "image/avif" or header @matcher Content-Type "application/wasm". Caddy evaluates matchers in the order directives appear in the site block, so place MIME overrides before the file_server directive that serves the static files. This approach changes only Content-Type for matched paths and leaves other response headers untouched.

Caddy's encode directive and already-compressed formats

Caddy's encode directive applies gzip or zstd HTTP compression to responses. It decides which responses to compress based on Content-Type; the default list includes text/html, application/json, and application/javascript. Adding AVIF or WebAssembly overrides with the header directive does not automatically add them to the encode compression list, which is correct behaviour since both formats are already compressed internally. Verify that encode does not apply a second compression pass to these formats by checking that the Content-Encoding header is absent from AVIF and WASM responses after the overrides take effect.

S3 and CloudFront static hosting MIME configuration

Amazon S3 paired with CloudFront is a common static hosting setup where MIME type configuration requires careful attention at the S3 layer, because CloudFront does not independently determine or correct Content-Type values. CloudFront passes the Content-Type header from the S3 origin response directly to the browser without modification, which means the MIME type stored in the object's ContentType metadata field in S3 is exactly what every browser receives on every edge node worldwide. Uploading files without specifying the content type causes S3 to default to application/octet-stream for formats it does not recognise by extension, triggering download prompts instead of inline rendering for images, fonts, and other displayable formats.

For AVIF images, set the content type to "image/avif" in the S3 upload parameters so that browsers render the image inline instead of triggering a download prompt. For WebAssembly binaries, set the content type to "application/wasm" to avoid the hard compile-time error browsers throw when the type is wrong. Adding these parameters to every upload in your CI pipeline prevents the application/octet-stream fallback from reaching users after each deployment, and it also ensures that any cache invalidation or re-upload during a rollback preserves the correct metadata.

Verifying MIME types on CloudFront distributions

After uploading with correct ContentType metadata, verify the CloudFront distribution by running curl -sI against the CloudFront URL rather than the S3 origin URL directly. CloudFront caches responses; if you previously served an object with the wrong Content-Type, create a CloudFront invalidation for the affected paths before retesting. Create the invalidation with aws cloudfront create-invalidation, passing your distribution ID and the path pattern "*.wasm", then wait for it to complete before running the curl verification.

Remember that the invalidation removes only the cached header value, not the underlying object, so a corrected S3 metadata write must land before the invalidation runs or the edge simply re-caches the wrong type. Ordering the write before the invalidation is the detail most deployments get wrong on the first attempt. CapyToolkit's MIME reference lists the expected Content-Type for every modern format so each curl check has a known target to compare against.

When to use this

Use this guide when setting up a new static file server, auditing an existing server configuration for MIME type mismatches, or verify server MIME types with curl when your server sends the wrong Content-Type.4

Examples

Nginx: add AVIF, WASM, and WOFF2 to the types block

Before
# Without explicit types, these files get application/octet-stream
After
types {
    image/avif  avif;
    application/wasm  wasm;
    font/woff2  woff2;
}

Place inside the http {} or server {} context, after the include mime.types line. These entries add to the built-in table rather than replacing it.

Apache .htaccess: add modern MIME types

Place in .htaccess or httpd.conf. Each AddType line applies to all requests matching that extension.

Caddy: MIME type overrides in Caddyfile

The header directive in Caddy sets response headers for matching requests, including Content-Type overrides.

Sources
  1. 1.

    "application/wasm," IANA, iana.org, accessed June 2026. https://www.iana.org/assignments/media-types/application/wasm

  2. 2.

    Maxim Dounin, "WebAssembly doesn't work on Firefox/Chrome due to missing MIME type," nginx trac ticket #1606, nginx.org, 2021. https://trac.nginx.org/nginx/ticket/1606

  3. 3.

    "Manipulates HTTP response header fields," Caddy docs, caddyserver.com, accessed June 2026. https://caddyserver.com/docs/caddyfile/matchers

  4. 4.

    J. Schaer et al., "HTTP Semantics," RFC 9110, IETF, January 2024. https://www.rfc-editor.org/info/rfc9110/

FAQ