掘金 后端 ( ) • 2024-06-23 11:08

theme: cyanosis

最近在使用Nginx配置服务器的一些反向代理业务时,我注意到配置文件中有一个include指令(用于包含其他配置文件。这有助于将配置分成多个文件,提高管理和维护的便利性)。在查看这些配置文件时,我发现它们主要分为MIME类型定义文件和其他配置文件。这让我很好奇,MIME类型定义文件到底是什么东西?为什么需要专门配置这些文件?

展开说说

mime.types 文件是一个用来映射文件扩展名与 MIME 类型(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)的文件。MIME 类型用于标识文件的内容类型,主要用于告知浏览器和其他客户端如何处理不同类型的文件。

这种官方解释是我这种编程小白能理解的吗?不要慌,接着往下看。

文件的内容格式

mime.types 文件通常包含若干行,每行定义了一对 MIME 类型和相应的文件扩展名。格式如下:

MIME类型 扩展名1 扩展名2 ...
type/subtype extension;
type/subtype extension extension;
  • type 是 MIME 类型的主要类别,例如 text, image, audio, video 等。
  • subtype 是具体类型的描述,例如 html, jpeg, mp3, ogg 等。
  • extension 是文件扩展名,例如 html, jpg, mp4, css 等。

示例:

text/html html htm shtml
image/jpeg jpeg jpg
application/json json

这里我以Nginx为例,讲一讲引用这个配置文件时,会起到什么效果

image/jpeg jpeg jpg;

这个配置行告诉 Nginx,任何以 .jpeg 或 .jpg 结尾的文件都应该被识别为 image/jpeg 类型。这意味着当 Nginx 服务器接收到一个请求,请求的文件路径以 .jpeg 或 .jpg 结尾时,Nginx 将会返回一个 Content-Type HTTP 响应头,其值为 image/jpeg。这个信息告诉客户端(通常是浏览器)处理这个文件时,应该把它当作 JPEG 图像格式来处理。

text/html html htm shtml;

这个配置行告诉 Nginx,任何以 .html.htm 或 .shtml 结尾的文件都应该被识别为 text/html 类型。这意味着当 Nginx 服务器接收到一个请求,请求的文件路径以 .html.htm 或 .shtml 结尾时,Nginx 将会返回一个 Content-Type HTTP 响应头,其值为 text/html。这个信息告诉客户端这个文件是一个 HTML 文档,应该被浏览器解析和显示为网页。

这样是不是就理解呢?

文件用途

  1. Web服务器配置:Web服务器(如 Apache、Nginx)使用 mime.types 文件来确定发送给客户端的文件的 MIME 类型。例如,当客户端请求一个 .html 文件时,服务器会根据 mime.types 文件中的映射,将响应头的 Content-Type 设置为 text/html

  2. 邮件客户端:邮件客户端使用 MIME 类型来确定附件的类型和显示方式。

  3. 文件传输和存储:一些文件传输和存储服务也会使用 MIME 类型来确保文件被正确识别和处理。

Nginx中的mime.types 配置

mime.types 文件配置的是 Nginx 服务器在处理文件内容时,如何根据文件扩展名来确定文件的 MIME 类型。这影响了服务器如何响应客户端请求,以及如何处理发送到客户端的内容。

除了让客户端正确处理文件以外,某些文件类型还可以通过启用压缩(如 gzip)来提升传输效率。

文件能写哪些内容?不能写什么?

允许配置内容

  • MIME类型和扩展名映射:如上例所示,可以配置任意的 MIME 类型和其对应的文件扩展名。
  • 自定义MIME类型:可以添加自定义的 MIME 类型和扩展名映射,以满足特定需求。

不允许配置内容

  • 非MIME相关配置mime.types 文件应仅包含 MIME 类型和扩展名的映射,不应包含其他Nginx配置指令,如 serverlocationproxy_pass 等。
  • 逻辑控制指令:不应包含逻辑控制指令,如 ifrewrite 等。这些指令应放在主配置文件或相关配置文件中。

奇怪的想法

咱们上面提到了可以添加自定义的 MIME 类型和扩展名映射,以满足特定需求。比如我把一个图片的后缀名定义为aaa,然后通过配置image/jpeg aaa;就可以让客户端正常解析?

原理上来说,当客户端请求带有 .aaa 扩展名的文件时,Nginx 会将 Content-Type 响应头设置为 image/jpeg,浏览器会根据这个 MIME 类型来处理这个文件,假设它是一个 JPEG 图片。

但是这里也有一些问题:

  1. 并非所有客户端都支持自定义 MIME 类型。一些客户端可能无法识别自定义的 MIME 类型,这可能会导致文件无法正确显示或处理。
  2. 浏览器通常会根据文件扩展名来决定如何处理文件。如果文件扩展名和 MIME 类型不匹配,浏览器可能会忽略 MIME 类型,而是根据文件扩展名来决定如何处理文件。

总结

最后给大家分享一个典型的 mime.types 文件,可以直接复制使用,内容如下:

types {
    text/html                        html htm shtml;
    text/css                         css;
    text/xml                         xml;
    image/gif                        gif;
    image/jpeg                       jpeg jpg;
    application/javascript           js;
    application/atom+xml             atom;
    application/rss+xml              rss;
    text/mathml                      mml;
    text/plain                       txt;
    text/vnd.sun.j2me.app-descriptor jad;
    text/vnd.wap.wml                 wml;
    text/x-component                 htc;
    image/png                        png;
    image/tiff                       tif tiff;
    image/vnd.wap.wbmp               wbmp;
    image/x-icon                     ico;
    image/x-jng                      jng;
    image/x-ms-bmp                   bmp;
    image/svg+xml                    svg svgz;
    image/webp                       webp;
    application/java-archive         jar war ear;
    application/mac-binhex40         hqx;
    application/msword               doc;
    application/pdf                  pdf;
    application/postscript           ps eps ai;
    application/rtf                  rtf;
    application/vnd.ms-excel         xls;
    application/vnd.ms-powerpoint    ppt;
    application/vnd.wap.wmlc         wmlc;
    application/vnd.google-earth.kml+xml kml;
    application/vnd.google-earth.kmz kmz;
    application/x-7z-compressed      7z;
    application/x-cocoa              cco;
    application/x-java-archive-diff  jardiff;
    application/x-java-jnlp-file     jnlp;
    application/x-makeself           run;
    application/x-perl               pl pm;
    application/x-pilot              prc pdb;
    application/x-rar-compressed     rar;
    application/x-redhat-package-manager rpm;
    application/x-sea                sea;
    application/x-shockwave-flash    swf;
    application/x-stuffit            sit;
    application/x-tcl                tcl tk;
    application/x-x509-ca-cert       der pem crt;
    application/x-xpinstall          xpi;
    application/xhtml+xml            xhtml;
    application/xspf+xml             xspf;
    application/zip                  zip;
    application/octet-stream         bin exe dll;
    application/octet-stream         deb;
    application/octet-stream         dmg;
    application/octet-stream         eot;
    application/octet-stream         iso img;
    application/octet-stream         msi msp msm;
    application/vnd.openxmlformats-officedocument.wordprocessingml.document docx;
    application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx;
    application/vnd.openxmlformats-officedocument.presentationml.presentation pptx;
    audio/midi                       mid midi kar;
    audio/mpeg                       mp3;
    audio/ogg                        ogg;
    audio/x-m4a                      m4a;
    audio/x-realaudio                ra;
    video/3gpp                       3gpp 3gp;
    video/mp2t                       ts;
    video/mp4                        mp4;
    video/mpeg                       mpeg mpg;
    video/quicktime                  mov;
    video/webm                       webm;
    video/x-flv                      flv;
    video/x-m4v                      m4v;
    video/x-mng                      mng;
    video/x-ms-asf                   asx asf;
    video/x-ms-wmv                   wmv;
    video/x-msvideo                  avi;
}