Kamailio:如何在INVITE请求的Contact头中追加参数?移除操作无效
Kamailio:保存原始Contact头并替换为带新参数的Contact头
问题根源
你的代码存在三个核心问题:
- 变量引用错误:生成新Contact头时使用了未定义的
$var(contact),应该引用之前保存的$var(orig_contact) - 日志验证逻辑有偏差:移除头后直接调用
$hdr(Contact)输出,Kamailio的$hdr()可能存在内部缓存,导致显示结果不准确,建议用已保存的变量值做验证 - 未处理多Contact头场景:
remove_hf("Contact")默认只移除第一个Contact头,如果请求中存在多个该头,就会有残留未被清除
修正后的可行代码
# 保存原始Contact头(单头场景) $var(orig_contact) = $hdr(Contact); xlog("L_INFO", "Original Contact: $var(orig_contact)\n"); # 循环移除所有Contact头,确保彻底清除 while($hdr(Contact)) { remove_hf("Contact"); } # 验证移除结果:此时$hdr(Contact)应为空 xlog("L_INFO", "After removal, Contact exists? $hdr(Contact)\n"); # 拼接新参数生成新Contact头 $var(new_contact) = $var(orig_contact) + ";param=value"; # 添加新的Contact头,注意要带\r\n换行符 append_hf("Contact: $var(new_contact)\r\n"); xlog("L_INFO", "New Contact added: $var(new_contact)\n");
补充说明
- 如果需要处理多个Contact头的场景,可以用
$(hdr(Contact)[n])(n从0开始)遍历每个头,逐个保存、处理后再添加回去 - 日志验证优先使用已保存的变量值,避免依赖
$hdr()的实时返回值,减少缓存干扰
内容的提问来源于stack exchange,提问作者Antoine Li
相关产品推荐
相关产品推荐

