ngx_http_charset_module 模块

优质
小牛编辑
130浏览
2023-12-01

ngx_http_charset_module模块为响应头的“Content-Type”添加指定的字符集。 此外,这个模块可以把数据从一个字符集转换为另一个字符集,但也有以下限制:

  • 只能单向转换,即从服务端到客户端,
  • 只有单字节字符集能被转换
  • 或者单字节字符集和UTF-8之间的互相转换。

配置示例

include        conf/koi-win;

charset        windows-1251;
source_charset koi8-r;

指令

语法:charset charset | off;
默认值:
charset off;
上下文:http, server, location, if in location

为响应头的“Content-Type”添加指定的字符集。 如果这个字符集和指令设置的字符集不同,就会进行转换。

参数off 表明不在响应头的“Content-Type”中添加字符集。

字符集可以当作变量来定义:

charset $charset;

这种情况下,一个变量所有可能的值,至少使用 , 或者 指令中的一种来配置。 对于 utf-8, windows-1251, 和 koi8-r 字符集,在配置中包含 conf/koi-win, conf/koi-utf, 和 conf/win-utf这些文件就足够了。 对于其他字符集,简单地做一个虚构转换表就可以了, 比如:

charset_map iso-8859-5 _ { }

此外,字符集也可以在响应头的 “X-Accel-Charset”中设置。 这个功能可以使用 proxy_ignore_headersfastcgi_ignore_headers 指令来禁用。

语法:charset_map charset1 charset2 { ... }
默认值:
上下文:http

描述了从一个字符集到另一个字符集的转换表。 反向转换表使用相同的数据来构建。 字符代码用十六进制表示。 在80-FF范围内不能表示的字符使用 “?”替换。 当把UTF-8转换为其他字符集时, 单字节字符集中不能表示的字符使用 “&#XXXX;”来替换。

示例:

charset_map koi8-r windows-1251 {
    C0 FE ; # small yu
    C1 E0 ; # small a
    C2 E1 ; # small b
    C3 F6 ; # small ts
    ...
}

当描述一个UTF-8的转换表时,UTF-8的字符集代码应该放在第二列,比如:

charset_map koi8-r utf-8 {
    C0 D18E ; # small yu
    C1 D0B0 ; # small a
    C2 D0B1 ; # small b
    C3 D186 ; # small ts
    ...
}

发行文件conf/koi-win, conf/koi-utf, and conf/win-utf中已经提供了从koi8-rwindows-1251,从koi8-rutf-8,以及从 windows-1251utf-8的完整转换表。

语法:charset_types mime-type ...;
默认值:
charset_types text/html text/xml text/plain text/vnd.wap.wml
application/x-javascript application/rss+xml;
上下文:http, server, location

这个指令出现在版本 0.7.9.

使模块在响应时能处理除了“text/html”之外其他指定的MIME类型。 特殊值“*” 匹配任意的MIME类型(0.8.29)。

语法:override_charset on | off;
默认值:
override_charset off;
上下文:http, server, location, if in location

对于接收到的代理服务器或者FastCGI服务器的响应头中“Content-Type”已经带有字符集的情况,确定是否进行字符集转换。 如果开启转换,接收到的响应中指定的字符集会被当作原始字符集。

需要注意的是,如果在子请求中接收到的应答,始终会将应答的字符集转换为主请求的字符集,无论override_charset 指令是否开启。

语法:source_charset charset;
默认值:
上下文:http, server, location, if in location

定义响应中的原始字符集。 如果这个字符集和指令设置字符集的不同,就会进行转换。

翻译: WenMing