ngx_http_escape_location_name

定义在 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

相关推荐
卜锦元1 小时前
Docker Compose 部署 Nginx 1.30.6 完整指南
nginx·docker·容器
小小龙学IT3 小时前
Nginx 开源 Web 服务器与反向代理深度解
前端·nginx·开源
Coisinier1 天前
docker命令管理镜像及容器
linux·运维·nginx·docker·容器·操作系统
2301_32241428041 天前
基于web的校园失物招领管理系统59695-计算机毕设 原创(免费领源码+部署教程+开发环境)
mysql·nginx·php·apache·thinkphp·phpstudy·wampserver
flytalei1 天前
从YAML到Nginx服务访问:动手理解 Kubernetes Pod、Deployment 与 Service
运维·nginx·kubernetes
健康活着就好2 天前
# Nginx负载均衡四种策略,从原理到配置
nginx
Vitaliy Kostrov(柯维远)2 天前
谁来承担额外工作?CDN 参与者如何协商资源
nginx·缓存·系统架构·开源·cdn
北城笑笑2 天前
Server 18 ,Nginx 双服务器 HTTP转HTTPS 代理实战( HTTP 地址换 HTTPS 域名 )
运维·服务器·前端·后端·nginx·http·https
Zenova EdgeOS2 天前
Linux Nginx 反向代理实战:工业边缘 API 接入与安全加固
linux·nginx·安全·边缘计算·工业网关