NGINX `ngx_http_charset_module` 字符集声明与编码转换
一、模块定位与功能
ngx_http_charset_module
主要提供两大能力:
- 响应头声明:在
Content-Type
头部自动添加; charset=XXX
,告知客户端所用字符集。 - 单向编码转换:在 NGINX 层将一种单字节编码(如
koi8-r
、windows-1251
)转成另一种(尤其是转成 UTF-8),消除浏览器乱码风险。
注意:只支持单字节 ⇢ 单字节、单字节 ⇢ UTF-8、或者 UTF-8 ⇢ 单字节;不支持多字节到多字节的相互转换,也不支持在客户端 ⇢ 服务器方向的转换。
二、核心指令
指令 | 作用 | 生效上下文 | |
---|---|---|---|
charset charset | off | 为响应设置字符集,并在需要时触发与 source_charset 不同的编码转换 | http, server, location, if |
source_charset charset | 指定后端原始响应的字符集 | 同上 | |
charset_types … | 限定哪些 MIME 类型的响应才进行字符集声明与转换 | http, server, location | |
`override_charset on | off` | 是否对已经带有 charset 的上游响应(proxy/fastcgi 等)进行转换 | 同上 |
charset_map c1 c2 {…} | 手动定义两个编码之间的字符映射表(可选,用于自定义或非常用编码) | http |
三、示例配置
假设后端内容以 koi8-r
编码存储,你想在响应中声明 windows-1251
字符集,并让 NGINX 同时将其转换为 windows-1251
:
# 引入官方提供的 koi8-r ⇄ windows-1251 的映射表
include conf/koi-win;# 声明客户端 Content-Type 使用 windows-1251
charset windows-1251;# 指定源编码为 koi8-r,触发转换
source_charset koi8-r;# 仅对以下 MIME 类型生效
charset_types text/html text/xml text/plain;
流程解析:
- NGINX 读取后端响应体,假定它是
koi8-r
。 - 发现
source_charset koi8-r
≠charset windows-1251
,使用conf/koi-win
中的编码表将内容从koi8-r
转成windows-1251
。 - 在
Content-Type
头部追加; charset=windows-1251
,浏览器据此解码显示。
四、指令细节与高级用法
1. charset_types
charset_types text/html text/xml text/plain application/javascript;
- 默认:
text/html text/xml text/plain text/vnd.wap.wml application/javascript application/rss+xml
- 通配:
charset_types *;
对任意 MIME 类型生效 - 建议:针对纯文本、HTML、XML 等需要转换的内容开启,避免二进制(如图片、压缩包)被误处理。
2. override_charset
override_charset on;
-
当使用
proxy_pass
、fastcgi_pass
等代理,上游响应头自带charset
时:off
(默认):不再转换,保留上游声明on
:使用上游的charset
作为源编码,转换至charset
指定值
3. 自定义映射表(可选)
若使用非常规编码,可在配置里手写映射:
charset_map iso-8859-5 utf-8 {A0 D090; # U+0400A1 D091; # U+0401...
}
- 格式:两个编码名称 +
{}
中的多行XX YY; # 注释
- 缺失字符:单字节→单字节 缺失时映为
?
;单字节→UTF-8 缺失时映为&#XXXX;
五、最佳实践
- 尽量使用官方映射表:NGINX 默认安装包内已含
conf/koi-win
、conf/koi-utf
、conf/win-utf
。 - 只处理文本类型:通过
charset_types
精确限定,避免二进制乱码或性能浪费。 - 代理时慎用
override_charset on
:当上游偶尔返回不同编码,开启后会触发频繁转换,影响性能。 - 关注内存与 CPU:大文件或高并发下,编码转换耗时明显。必要时可将转换下沉到后端应用,或用 CDN 边缘转换。
- 测试覆盖:在浏览器中测试多种字符(拉丁文、Cyrillic、中文),确保转换无损。
六、总结
ngx_http_charset_module
是 NGINX 提供的轻量级编码声明与转换利器,能够在 HTTP 层帮助你优雅解决乱码问题。通过简单的几条指令,就能:
- 明确告知浏览器正确的
charset
; - 在服务器端一键转换常见单字节编码到 UTF-8 或其他单字节编码;
- 自定义或扩展非常规编码映射,满足多语种需求。
在实际项目中,它常被用于对接老旧系统、处理遗留数据、以及构建多语言网站的基础架构。掌握本模块,能让你的 NGINX 服务更具兼容性和健壮性。
相关文章:
NGINX `ngx_http_charset_module` 字符集声明与编码转换
一、模块定位与功能 ngx_http_charset_module 主要提供两大能力: 响应头声明:在 Content-Type 头部自动添加 ; charsetXXX,告知客户端所用字符集。单向编码转换:在 NGINX 层将一种单字节编码(如 koi8-r、windows-125…...

视频编解码学习三之显示器
整理自:显示器_百度百科,触摸屏_百度百科,百度安全验证 分为阴极射线管显示器(CRT),等离子显示器PDP,液晶显示器LCD 液晶显示器的组成。一般来说,液晶显示器由以下几个部分组成: […...
Python中的re库详细用法与代码解析
目录 1. 前言 2. 正则表达式的基本概念 2.1 什么是正则表达式? 2.2 常用元字符 3. re库的适应场景 3.1 验证用户输入 3.2 从文本中提取信息 3.3 文本替换与格式化 3.4 分割复杂字符串 3.5 数据清洗与预处理 4. re库的核心功能详解 4.1 re.match()&#…...

K8s网络从0到1
K8s网络从0到1 前言 K8s是一个强大的平台,但它的网络比较复杂,涉及很多概念,例如Pod网络,Service网络,Cluster IPs,NodePort,LoadBalancer和Ingress等等。为了帮助大家理解,模仿TC…...

13.Excel:分列
一 分列的作用 将一个单元格中的内容拆分到两个或多个单元格当中。 二 如何使用 1.常规分列使用 注意:分列功能一次只能拆分一列。 长度一致或者数据间有分隔符。 补充:快速选择一列。 CTRL shift 向下箭头。 补充:中英文逗号不同。 可以先通…...
第十六届蓝桥杯大赛软件赛C/C++大学B组部分题解
第十六届蓝桥杯大赛软件赛C/C大学B组题解 试题A: 移动距离 问题描述 小明初始在二维平面的原点,他想前往坐标(233,666)。在移动过程中,他只能采用以下两种移动方式,并且这两种移动方式可以交替、不限次数地使用: 水平向右移动…...

计算机网络应用层(5)-- P2P文件分发视频流和内容分发网
💓个人主页:mooridy 💓专栏地址:《计算机网络:自顶向下方法》 大纲式阅读笔记_mooridy的博客-CSDN博客 💓本博客内容为《计算机网络:自顶向下方法》第二章应用层第五、六节知识梳理 关注我&…...

Gin优雅关闭 graceful-shutdown
文章目录 优雅关闭示例 - Close 方法项目结构使用方法代码如下代码说明如果去掉代码中的数字1,会发生什么 优雅关闭示例项目结构使用方法使用上下文通知不使用上下文通知 代码 notify-without-context-server.go代码说明 代码 notify-with-context-server.go代码说明…...
Android 查看 Logcat (可纯手机方式 无需电脑)
安装 Logcat Reader Github Google Play 如果有电脑 使用其ADB方式可执行如下命令 后续无需安装Termux # 使用 ADB 授予 android.permission.READ_LOGS 权限给 Logcat Reader adb shell "pm grant com.dp.logcatapp android.permission.READ_LOGS && am force-…...
Java 中常见的数据结构及其常用 API
本文总结了 Java 中常见的数据结构及其常用 API,帮助开发者在写算法时能够快速选择合适的数据结构和操作。通过使用合适的 API,可以有效减少计算复杂度,并提高代码的执行效率。 1. 数组 数组是 Java 中最常用的数据结构之一,Jav…...

五子棋html
<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>五子棋游戏</title> <style>bo…...
在Laravel 12中实现基于parent_id的树状数组
在Laravel中实现基于parent_id的树状数组,可以通过预加载所有节点并在内存中递归构建树结构来完成。以下是具体步骤和代码示例: 1. 创建模型及数据库迁移 迁移文件: // 创建节点表 Schema::create(nodes, function (Blueprint $table) {$t…...

JavaWeb:后端web基础(TomcatServletHTTP)
一、今日内容 二、Tomcat 介绍与使用 介绍 基本使用 小结 配置 配置 查找进程 三、Servlet 什么是Servlet 快速入门 需求 步骤 1.新建工程-模块(Maven) 2.修改打包方式-war 3.编写代码 /*** 可以选择继承HttpServlet*/ WebServlet("/hello&q…...
C++负载均衡远程调用学习之负载均衡算法与实现
目录 01 lars 系统架构回顾 02 lars-lbAgentV0.4-route_lb处理report业务流程 03 lars-lbAgentV0.4-负责均衡判断参数配置 04 lars-lbAgentV0.4-负载均衡idle节点的失败率判断 05 lars-lbAgentV0.4-负载均衡overload节点的成功率判断 06 lars-lbAgentV0.4-负载均衡上报提交…...

缓存(1):三级缓存
三级缓存是指什么 我们常说的三级缓存如下: CPU三级缓存Spring三级缓存应用架构(JVM、分布式缓存、db)三级缓存 CPU 基本概念 CPU 的访问速度每 18 个月就会翻 倍,相当于每年增⻓ 60% 左右,内存的速度当然也会不断…...

Cursor —— AI编辑器 使用详解
Cursor - The AI Code Editor 一、Cursor 是什么? Cursor 是一款优秀的AI代码编辑器,它内置了 Deepseek-R1、GPT-4、Claude等 AI 模型。 简单说,就是:Cursor VS Code 编辑器 AI 大模型 Cursor 功能特性(代码补全、…...

Pytorch-CUDA版本环境配置
Pytorch-CUDA版本环境配置 电脑如果是Windows平台下的Nvidia GPU的用户,需配置Pytorch的CUDA版本,分为三步: 1. 安装或更新NVIDA显卡驱动 官方驱动下载地址: https://www.nvidia.cn/Download/index.aspx?langcn 2. 安装CUDA Too…...
一个完整的神经网络训练流程详解(附 PyTorch 示例)
🧠 一个完整的神经网络训练流程详解(附 PyTorch 示例) 📌 第一部分:神经网络训练流程概览(总) 在深度学习中,构建和训练一个神经网络模型并不是简单的“输入数据、得到结果”这么简…...

OpenCV 图形API(77)图像与通道拼接函数-----对图像进行几何变换函数remap()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 对图像应用一个通用的几何变换。 函数 remap 使用指定的映射对源图像进行变换: dst ( x , y ) src ( m a p x ( x , y ) , m a p y…...
windows通过wsl安装ubuntu20.04
1 *.bat文件安装hyper-v pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"…...

Spring AI 入门(持续更新)
介绍 Spring AI 是 Spring 项目中一个面向 AI 应用的模块,旨在通过集成开源框架、提供标准化的工具和便捷的开发体验,加速 AI 应用程序的构建和部署。 依赖 <!-- 基于 WebFlux 的响应式 SSE 传输 --> <dependency><groupId>org.spr…...

QUIC协议优化:HTTP_3环境下的超高速异步抓取方案
摘要 随着 QUIC 和 HTTP/3 的普及,基于 UDP 的连接复用与内置加密带来了远超 HTTP/2 的性能提升,可显著降低连接握手与拥塞恢复的开销。本文以爬取知乎热榜数据为目标,提出一种基于 HTTPX aioquic 的异步抓取方案,并结合代理 IP设…...

uni-app实现完成任务解锁拼图功能
界面如下 代码如下 <template><view class"puzzle-container"><view class"puzzle-title">任务进度 {{completedCount}}/{{totalPieces}}</view><view class"puzzle-grid"><viewv-for"(piece, index) in…...
Vue3 中当组件嵌套层级较深导致 ref 无法直接获取子组件实例时,可以通过 provide/inject + 回调函数的方式实现子组件方法传递到父组件
需求:vue3中使用defineExposeref调用子组件方法报错不是一个function 思路:由于组件嵌套层级太深导致ref失效,通过provide/inject 回调函数来实现多层穿透 1. 父组件提供「方法注册函数」 父组件通过 provide 提供一个用于接收子组件方法…...
关于 js:3. 闭包、作用域、内存模型
一、闭包的本质:函数 其词法作用域环境 闭包(Closure)的本质可以概括为: 闭包是一个函数,以及它定义时捕获的词法作用域中的变量集合。 这意味着:即使外部函数已经返回或作用域结束,只要有内…...

数据链路层(MAC 地址)
目录 一、前言: 二、以太网: 三、MAC 地址的作用: 四、ARP协议: 一、前言: 数据链路层主要负责相邻两个节点之间的数据传输,其中,最常见数据链路层的协议有 以太网(通过光纤 / 网…...

基于DQN的自动驾驶小车绕圈任务
1.任务介绍 任务来源: DQN: Deep Q Learning |自动驾驶入门(?) |算法与实现 任务原始代码: self-driving car 最终效果: 以下所有内容,都是对上面DQN代码的改进&#…...
terraform resource创建了5台阿里云ecs,如要使用terraform删除其中一台主机,如何删除?
在 Terraform 中删除阿里云 5 台 ECS 实例中的某一台,具体操作取决于你创建资源时使用的 多实例管理方式(count 或 for_each)。以下是详细解决方案: 方法一:使用 for_each(推荐) 如果创建时使…...

【Linux】Linux工具(1)
3.Linux工具(1) 文章目录 3.Linux工具(1)Linux 软件包管理器 yum什么是软件包关于 rzsz查看软件包——yum list命令如何安装软件如何卸载软件补充——yum如何找到要安装软件的下载地址 Linux开发工具Linux编辑器-vim使用1.vim的基…...
探索大语言模型(LLM):词袋法(Bag of Words)原理与实现
文章目录 引言一、词袋法原理1.1 核心思想1.2 实现步骤 二、数学公式2.1 词频表示2.2 TF-IDF加权(可选) 三、示例表格3.1 构建词汇表3.2 文本向量化(词频) 四、Python代码实现4.1 基础实现(手动计算)4.2 输…...