ngx_http_merge_loc_conf是Nginx模块中实现location配置继承与合并的核心回调函数,用于在配置解析末期决定子location如何继承、覆盖或补充父级配置,其典型策略为:字符串未设置时继承父值,标志位用ngx_conf_merge_value宏处理UNSET状态。

ngx_http_merge_loc_conf 是 Nginx 模块开发中实现 location 级配置继承与合并的核心回调函数,它让子 location 能合理继承、覆盖或补充父级(server 或更外层 location)的配置项。
作用本质:解决“谁的配置生效”问题
在 Nginx 配置中,location 可嵌套或同级并存,同一模块的配置指令可能出现在 server 块、外层 location、内层 location 中。Nginx 不会自动叠加或覆盖,而是依赖模块自己定义合并逻辑。
ngx_http_merge_loc_conf 就是这个“定义权”的入口——它在配置解析末期被调用,接收父级(parent)、本级(child)、以及临时模板(conf)三份配置结构体,由你决定最终该 location 使用哪套值。
典型合并模式(以字符串和标志位为例)
假设你的模块有如下配置字段:
- char *my_string; —— 字符串型配置(如路径前缀)
- ngx_flag_t my_enabled; —— 开关型配置(0/1)
常见合并策略如下:
- 字符串:子 location 显式配置则用子的;未配置则继承父的(避免 NULL 解引用)
- 开关:子 location 显式设为 off(0),就关闭;设为 on(1),就开启;未设置时继承父值(需用 NGX_CONF_UNSET 标记未初始化)
- 数组或链表类结构:通常需深拷贝 + 合并(如把父的 list 插入子 list 末尾,或去重合并)
关键编码要点
- 函数签名必须为:static char *ngx_http_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child);
- parent 和 child 是你模块的配置结构体指针,类型需匹配;务必做类型转换
- 用 NGX_CONF_UNSET 判断字段是否被用户显式配置(Nginx 在创建配置时已预填此值)
- 字符串字段若继承,直接赋值指针即可(Nginx 内存池保证生命周期);若需拼接或生成新字符串,用 ngx_pstrdup 或 ngx_pcalloc + ngx_copy
- 返回 NGX_CONF_OK 表示成功;返回 NGX_CONF_ERROR 会中断启动并报错
一个极简示例(伪代码)
假设模块配置结构为:
typedef struct {<br> ngx_str_t my_path;<br> ngx_flag_t my_enabled;<br>} ngx_http_foo_loc_conf_t;
合并函数可写为:
static char *<br>ngx_http_foo_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child) {<br> ngx_http_foo_loc_conf_t *prev = parent;<br> ngx_http_foo_loc_conf_t *conf = child;<br><br> if (conf->my_path.data == NULL) {<br> conf->my_path = prev->my_path;<br> }<br><br> ngx_conf_merge_value(conf->my_enabled, prev->my_enabled, 0);<br><br> return NGX_CONF_OK;<br>}
其中 ngx_conf_merge_value 是 Nginx 提供的宏,自动处理 NGX_CONF_UNSET 判断,推荐直接使用。

















