一 MIME简介 了解
++++++++++++'MIME简介'++++++++++++
1)全称'Multipurpose Internet Mail Extension(多用途因特网邮件扩展)'最初是为了满足'电子邮件'支持'多字符集'及'附件'而出现的
2)通过MIME,我们可以写一封'既含有英文'、'又含有中文',再加上一个'文件作为附件'的邮件,这种含有'多种类型数据的文件'被称为多部分对象集合(Multipart messages)
3)MIME Type '不是个人指定'的,是经过 'ietf 组织协商',以' RFC 的形式'作为建议的'标准'发布在网上的
4)大多数的' Web 服务器'和'用户代理'都会'支持'这个规范
备注: 'Email 附件的类型'也是通过 'MIME Type 指定'的
+++++++++++'媒体类型'+++++++++++
媒体类型通常是'通过 HTTP 协议',由 'Web 服务器'告知'浏览器'的
'如何告知': 是通过 'Content-Type'这个响应头来表示的
例如:Content-Type: text/htmlL,表示'内容是 text/html 类型',也就是'超文本文件'
二 MIME-Type和Content-Type的关系
++++++++++'MIME-type和Content-Type的关系'++++++++++
1)HTTP服务器在'响应'一份'报文主体'时,在HTTP'报文头部'插入'解释自身数据类型'的MIME头部信息-->'Content-Type'
2)当web'服务器收到'静态的资源文件请求时,依据'请求文件的后缀名'在服务器的'MIME配置文件中找'到对应的'MIME Type',再根据MIME Type'设置HTTP Response的Content-Type',然后'客户端如浏览器'根据Content-Type的值'处理文件'
① 服务端如何处理静态资源文件
媒体类型通常是通过 'HTTP' 协议,由 Web 服务器过'Content-Type值'来告知'浏览器'的
例如:'响应头' -->Content-Type: text/html
② 客户端如何处理Content-Type值请求
浏览器是'如何区分'它们,进而决定'什么内容'用'什么形式'来显示呢?
三 nginx中关于媒体类型
① nginx中的 mime.types文件
'include'表示'纳入mime.types文件'的配置
举例: 形如text'/html格式'的字符串就是用来说明'数据类型'的
1)'/'前的是'主'类型
2)'/之后'的是该主类型下的'子类型'
备注:详细的类型定义在'RFC2046'中
解决nginx下加载eot|otf|ttf|woff|svg等404 错误问题
作用:在'mime.type'文件中找不到'文件'映射的'type'时'采用'默认的'default_type'
如果web程序'没设置,'Nginx也'没找到'对应文件的'扩展名'的'type'话,就使用'默认的Type'
③ types
四 案例讲解
比如:当我们打开'chrome浏览器'看一个'PNG格式的图片'的时候,Nginx是这样'发送格式信息'的:
1)服务器上'有wzj.png'这个文件,后缀名是png;
2)根据'include mime.types'查找到这个文件的'数据类型'应该是'image/png';
3)将'Content-Type'的值设置为'image/png',然后发送给'客户端(浏览器)'
1)如果处理'本地的'文件,在'没有人告诉'浏览器某个文件的 MIME Type 的情况下,浏览器也会做一些'默认的处理'
2)'默认的处理'和你'在操作系统中'给文件配置的 'MIME Type 有关'
Windows 下: 打开注册表的"HKEY_LOCAL_MACHINESOFTWAREClassesMIMEDatabaseContent Type"主键,可以看到'所有 MIME Type' 的配置信息
Linux下:通过一个'文本文件静态'关联数据库,负责将'application'(应用程序描述文件)与'MIME type'(Shared MIME Database)对应起来
Centos7该'数据库'为:/usr/share/applications/mimeinfo.cache
+++++++++ 'Content-Type更通用的格式' +++++++++
Content-Type: [type]/[subtype]; parameter
用于定义网络文件的'类型'和网页的'编码',决定浏览器将以'什么形式'、'什么编码读取'这个文件
Content-Type 标头是'服务器'告诉客户端'实际返回的内容'的'内容类型'
++++++++++'语法格式'++++++++++
Content-Type: text/html; charset=utf-8
① 查看文件的MIME Type
格式: mimetype filename
备注: mimetype命令'需要安装'
yum install perl-File-MimeInfo.noarch -y
②根据文件的MIME type找到打开方式
gio mime mime_type
五 思考
(1)浏览器对于一个文件类型是如何判断渲染显示还是下载
浏览器的'原则'是能'打开'就打开-->'在自己的媒体类型中',不能打开'就下载'
1)每个'浏览器内置支持'的 Content-Type 类型表各不相同,这导致了'某些类型字符串'在'某些浏览器下'不被识别
2)另外如果'出现错误'的 Content-Type 类型,各个浏览器又会'以不同的方式'处理
思考: 如果客户端请求-->'request'的'Content-Type'和服务器响应-->'response'的'Content-Type'不一致呢?
(2)对于特定的文件类型,强制让其显示内容,而不是不能识别导致下载
常见: 'application/octet-stream'
是'HTTP规范中'Content-Type的一种.意思是:'未知'的'应用程序'文件,浏览器一般'不会自动执行'或'询问执行',表示这是个'二进制流',需要'下载到本地'后由'用户端环境决定'如何使用
备注: '如果'提交文件的话,只能'提交一个文件',后台'接收参数'只能有'一个',而且只能是流(或者字节数组)
nginx配置让任何文件在浏览器中显示文本text/plain或者xml,而不是下载
已知: 对于'text/plain'格式的文件,可以在'任何浏览器'中'直接打开'而不会下载
需求: 在nginx中配置'perl'这种特殊结尾的文件为'直接打开',而不是下载
+++++++++'从三个粒度来解析'+++++++++
主要作为'对比'实验
① 默认是下载
说明: nginx的无法识别'perl结尾的文件',能识别'pl和pm'结尾的文件,'并且'如果安装了对应的模块,并在nginx种做了相应的配置,则会'解析该脚本'后返回内容给客户端
② 方式1:全局
vim /etc/nginx/mime.types
说明: 最好不要'一种后缀文件'对应'多种媒体类型'
注意: 修改之后一定要'restart','reload'不生效
备注: 可以'写在同一行',以'空格隔开';也可以'另起一行'
细节: 这个方法修改后'影响所有nginx网站'的配置
③ 方式2:只针对某种文件类型(推荐)
备注: 甚至可以'自定义文件'类型,但是浏览器可能'不能'按照该种格式解析-->因为是'伪造'的
单独打开'某个网站'的配置文件,在server中修改
案例: 所有目录下'以perl结尾的文件'显示为'text/plain'格式
location ~ .*\.perl$ {
add_header Content-Type text/plain;
}
④ 方式3:只针对某个站点的某个目录下的文件
location /perl/ {
'location嵌套'
location ~* .*\.perl$ {
add_header Content-Type text/plain;
}
⑤ 效果展示
(6)强制设置所有文件都是下载的
header中Content-Disposition的作用与使用方法
location / {
root html;
add_header Content-Disposition "attachment; filename=$1";
index index.html
}
#nginx.conf
#在server > location块内加入
types{
video/webm mkv;
}