当前位置: 首页 > news >正文

03 nginx 是如何自动推导文件的 content-type 的

前言

nginx 可以作为一个 静态资源服务器 

我们暴露一个 nginx 服务 

然后 从浏览器访问 存储的文件, 图片, 视频, html 等等, nginx 可以正确的 设置 Content-Type 给客户端使用 

客户端 识别到了 图片, 自动加载图片, 识别到了 html, 自动渲染 html 

识别到了 其他二进制文件, 自动下载文件 等等 

我们这里 就来看一下 nginx 是如何响应 Content-Type 的 

以下截图, 调试基于 nginx-1.18.0

ngx_http_set_content_type 

本文的答案就在这里了 

如果上游服务已经设置了 Content-Type, 使用已有的 Content-Type 

否则根据 r.uri 的 extension 来尝试获取 Content-Type, clcf->types_hash 中存放了各种后缀 映射的 Content-Type, 如果获取到了, 使用该 Content-Type 

否则 使用配置的 默认的Content-Type 

请求为 "/regex11.html"

根据 "html" 获取 Content-Type, 拿到的是 "text/html", 响应给客户端  

(gdb) b ngx_http_core_module.c:1616
Breakpoint 6 at 0x107d247f6: file src/http/ngx_http_core_module.c, line 1616.
(gdb) print r.uri
$83 = {len = 13, data = 0x7fa04a000004 "/regex11.html HTTP/1.1\r\nHost"}
(gdb) list
1611	
1612	        }
1613	
1614	        type = ngx_hash_find(&clcf->types_hash, hash,
1615	                             r->exten.data, r->exten.len);
1616	
1617	        if (type) {
1618	            r->headers_out.content_type_len = type->len;
1619	            r->headers_out.content_type = *type;
1620	
(gdb) next
1617	
(gdb) print type
$80 = (ngx_str_t *) 0x7fa048017d50
(gdb) print type.data
$81 = (u_char *) 0x7fa048017d30 "text/html"
(gdb) print clcf->default_type
$82 = {len = 24, data = 0x7fa048018c95 "application/octet-stream"}

clcf->types.hash 来自于哪里?

来自于 mime.types 的配置文件 

http { 
    include       mime.types;
    default_type  application/octet-stream;
    // xxx 
}

相关文章:

  • Java 8 Stream 从入门到进阶——像SQL一样玩转集合
  • C++STL详解(五)mapset的使用及其模拟实现
  • 串口通信-USART和UART的区别
  • Docker常见操作
  • YOLOV7详细解读(一)网络架构解读
  • 【侯捷C++-----STL与泛型编程】
  • es6对象的扩展、对象的新增方法
  • Stream流
  • DRM系列(8)之prepare_signaling
  • 企业级C++项目那些事(1):VSQt相关设置
  • 基于51单片机温湿度控制器proteus仿真设计
  • adb常用命令总结[持续更新]
  • 二分查找练习
  • 【Unity面试】 Lua语言基础核心 | 面试真题 | 全面总结 | 建议收藏
  • 结构化编程(SP,structured programming)
  • 0基础学习移动端适配
  • iOS 系统授权开发
  • Java 内存分配及垃圾回收机制初探
  • jdbc就是这么简单
  • jquery ajax学习笔记
  • MySQL几个简单SQL的优化
  • Object.assign方法不能实现深复制
  • php面试题 汇集2
  • php中curl和soap方式请求服务超时问题
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • Spring-boot 启动时碰到的错误
  • 半理解系列--Promise的进化史
  • 从0实现一个tiny react(三)生命周期
  • 搭建gitbook 和 访问权限认证
  • 如何进阶一名有竞争力的程序员?
  • 与 ConTeXt MkIV 官方文档的接驳
  • 正则学习笔记
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (06)金属布线——为半导体注入生命的连接
  • (pojstep1.1.2)2654(直叙式模拟)
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (二)构建dubbo分布式平台-平台功能导图
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (四)鸿鹄云架构一服务注册中心
  • (一)VirtualBox安装增强功能
  • .form文件_SSM框架文件上传篇
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net6 Api Swagger配置
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET中两种OCR方式对比
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • .考试倒计时43天!来提分啦!
  • // an array of int
  • @TableLogic注解说明,以及对增删改查的影响
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [ACTF2020 新生赛]Upload 1