On OpenBSD's httpd, there are only a select few MIME types that are
recognized by default. According to httpd.conf(5), those types are:
ext/css, text/html, text/plain, image/gif, image/png,
image/jpeg, image/svg+xml, and
application/javascript. Everything else is said to be of type
application/octet-stream by default.
This is OK for most static hosting situations, but can be challenging
for some common attachment types. For example, I recently made a blog
post that had an attached PDF. Normally web browsers open PDF files in
the browser's PDF viewer, but since it was being returned with the
MIME type application/octet-stream, the browser decided to download
it instead of opening it directly. This isn't a tragedy, but it can
be annoying and interrupt the flow of the user's experience.
The solution to this is to include the application/pdf MIME type in
a TYPES block in your httpd.conf. There are two ways to go about
this. Either by manually defining the type you require, or including
the system's built-in MIME type database.
Using the first method you would include a types block that defines all of the MIME types you require. This types block can go anywhere outside of a server declaration.
The types are defined in the format of type/subtype name [name ...].
types {
text/css css
text/html html htm
text/plain txt
image/gif gif
image/jpeg jpeg jpg
image/png png
application/javascript js
application/pdf pdf
}
The second method, including the system's built-in MIME types
database, is simpler if you need to support proper MIME types for a
larger number of files, and don't want to go through the process of
writing them all in by hand. This is done by defining a similar types
block, but instead of writing in type data, you use the include
directive. OpenBSD's MIME type definitions are stored in
/usr/share/misc/mime.types.
types {
include "/usr/share/misc/mime.types"
}
After editing the configuration file, all you have to do is reload
httpd, and it should begin recognizing file types properly.
doas rcctl reload httpd