如何转换URI中的字符串?OpenSips 2.3重写URI失败求助
我来帮你逐个解决这两个问题:
问题1:如何转换URI中的字符串?
在OpenSIPS里处理URI字符串,常见需求和对应实现方式如下:
- URI编码/解码:如果要处理URI里的特殊字符(比如中文、空格这类不符合URI规范的字符),可以用内置函数快速处理:
- 编码:用
uri_encode()把非合规字符转成百分号编码,比如:$var(encoded_uri) = uri_encode("sip:张三@example.com"); - 解码:用
uri_decode()把百分号编码还原成原始字符,比如:$var(decoded_uri) = uri_decode("sip:%E5%BC%A0%E4%B8%89@example.com");
- 编码:用
- 字符串替换:如果要修改URI里的特定部分(比如替换域名、用户名),有两种实用方式:
- 全局替换子串:用
replace()函数直接修改请求URI,比如把旧域名换成新域名:replace("$ru", "old-domain.com", "new-domain.com"); - 单独修改URI组件:OpenSIPS提供了专门变量对应URI的各个部分,比如直接改域名用
$rd,改用户名可以直接操作$ru的对应部分:$rd = "new-domain.com"; # 直接设置请求URI的域名
- 全局替换子串:用
- 格式标准化:如果要确保URI符合SIP规范(比如必须带
sip:前缀),可以先判断再补全:if (!is_sip_uri("$ru")) { $ru = "sip:" + $ru; }
问题2:OpenSIPS 2.3中rewriteuri()使用AVP值失效的问题
你遇到的错误ERROR:core:parse_sip_msg_uri: bad uri <[$ru>,核心原因是你把变量$ru用引号和方括号包起来了,OpenSIPS没有解析变量,而是把[$ru]当成了字面量URI,这显然不符合SIP URI格式,所以报错了。
给你几个解决步骤:
- 正确调用rewriteuri():函数可以直接接收变量作为参数,不需要加引号和方括号。正确写法是:
$ru = "sip:" + $avp(didnumber); rewriteuri("$ru"); # 或者更简洁,直接把拼接结果传进去,省掉中间变量 rewriteuri("sip:" + $avp(didnumber)); - 验证AVP值的合法性:先确认从数据库拿到的
$avp(didnumber)是有效的URI片段(比如是user@domain.com这种格式,而不是只有用户名或者乱码)。可以加日志打印检查:
如果值不完整(比如只有用户名),记得补充域名部分,比如:xlog("L_INFO", "从数据库获取的didnumber值:$avp(didnumber)\n");rewriteuri("sip:" + $avp(didnumber) + "@your-proxy-domain.com"); - 检查拼接语法:确保拼接的时候没有多余空格,比如
"sip:"+$avp(didnumber)不要写成"sip: " + $avp(didnumber),空格会导致URI格式错误。
内容的提问来源于stack exchange,提问作者Kamal Panhwar
相关产品推荐
相关产品推荐

