定义在 src\http\ngx_http.c
static ngx_int_t
ngx_http_escape_location_name(ngx_conf_t *cf, ngx_http_core_loc_conf_t *clcf)
{
u_char *p;
size_t len;
uintptr_t escape;
escape = 2 * ngx_escape_uri(NULL, clcf->name.data, clcf->name.len,
NGX_ESCAPE_URI);
if (escape) {
len = clcf->name.len + escape;
p = ngx_pnalloc(cf->pool, len);
if (p == NULL) {
return NGX_ERROR;
}
clcf->escaped_name.len = len;
clcf->escaped_name.data = p;
ngx_escape_uri(p, clcf->name.data, clcf->name.len, NGX_ESCAPE_URI);
} else {
clcf->escaped_name = clcf->name;
}
return NGX_OK;
}
ngx_http_escape_location_name
函数的作用是对 Nginx 配置中location
块的名称进行 URI 转义处理,并将结果保存到配置结构体中。具体步骤如下:
计算转义需求 :通过
ngx_escape_uri
检查location
名称中需要转义的字符数量(如空格、特殊符号等),并计算转义后所需的额外空间。
内存分配与转义 :若存在需转义的字符,则分配新内存,将原名称转义为符合 URI 规范的格式(如空格转为
%20
),存储到clcf->escaped_name
。
直接引用原名称 :若无需转义,则直接将
escaped_name
指向原始名称,避免内存拷贝。核心目的 :确保
location
名称在后续处理(如 URL 匹配、重定向生成)中符合 URI 编码规范,避免因特殊字符导致的解析错误。该函数在配置解析阶段被调用,为后续请求处理提供安全、规范的名称格式
escape = 2 * ngx_escape_uri(NULL, clcf->name.data, clcf->name.len,
NGX_ESCAPE_URI);
计算
location
名称在 URI 转义后所需的额外内存空间确保
location
名称中的特殊字符(如%
、?
、#
)被正确转义,避免 URI 解析歧义。
ngx_escape_uri
函数的作用
- 功能 :检查
clcf->name
(即location
的原始名称)中需要 URI 转义的字符数量。- 参数 :
NULL
:表示仅计算需要转义的字符数,不实际执行转义操作。clcf->name.data
和clcf->name.len
:原始location
名称的字符串及其长度。NGX_ESCAPE_URI
:转义模式,指定对 URI 中的特殊字符(如空格、#
、%
等)进行编码。- 返回值 :返回需要转义的字符数量(例如,若原始名称包含
#
和空格,返回2
)。乘以 2 的意义
URI 转义会将 1 个特殊字符 转换为 3 个字符 (例如,空格转为
%20
)。因此:
- 原始字符长度 :
1
字节。- 转义后长度 :
3
字节。- 额外需要的空间 :
3 - 1 = 2
字节/字符。通过
2 * 转义字符数
,计算出 所有转义字符所需的额外总空间。例如:
- 若原始名称有
2
个特殊字符,则额外需要2 * 2 = 4
字节。
2. 代码的核心目的
为后续的 URI 转义操作 预分配足够的内存空间:
- 原始名称长度 :
clcf->name.len
。- 转义后总长度 :
clcf->name.len + escape
(原始长度 + 额外空间)。- 内存分配 :后续通过
ngx_pnalloc
分配len
大小的内存,确保转义后的字符串(如%20
)能完整存储。
ngx_escape_uri-CSDN博客此时 escape=0
if (escape) {
此时条件不成立,进入else
else {
clcf->escaped_name = clcf->name;
}
return NGX_OK;
复制 name 字段给 escaped_name 字段
返回 NGX_OK