You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何转换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格式,所以报错了。

给你几个解决步骤:

  1. 正确调用rewriteuri():函数可以直接接收变量作为参数,不需要加引号和方括号。正确写法是:
    $ru = "sip:" + $avp(didnumber);
    rewriteuri("$ru");
    # 或者更简洁,直接把拼接结果传进去,省掉中间变量
    rewriteuri("sip:" + $avp(didnumber));
    
  2. 验证AVP值的合法性:先确认从数据库拿到的$avp(didnumber)是有效的URI片段(比如是user@domain.com这种格式,而不是只有用户名或者乱码)。可以加日志打印检查:
    xlog("L_INFO", "从数据库获取的didnumber值:$avp(didnumber)\n");
    
    如果值不完整(比如只有用户名),记得补充域名部分,比如:
    rewriteuri("sip:" + $avp(didnumber) + "@your-proxy-domain.com");
    
  3. 检查拼接语法:确保拼接的时候没有多余空格,比如"sip:"+$avp(didnumber)不要写成"sip: " + $avp(didnumber),空格会导致URI格式错误。

内容的提问来源于stack exchange,提问作者Kamal Panhwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:08:49