Asterisk 20.03 PJSIP如何转发呼入INVITE中的全部SIP头部?
Asterisk 20.03 转发自定义SIP头部到客户端
原配置问题分析
你的配置存在两个核心问题:
- 所有步骤的优先级均为
1,Asterisk只会执行最后一条优先级为1的指令(即Dial),前面的Set操作完全不会运行。 - 即便
Set操作执行成功,也只是将头部值存入变量,并未告知Asterisk要把这些头部添加到 outgoing 的SIP INVITE中。
解决方案
方式1:转发指定的自定义头部
调整步骤优先级,使用PJSIP_HEADER(add)指令将读取到的头部直接添加到 outgoing 消息中:
; extensions.conf [default] exten => 1234,1,Set(PJSIP_HEADER(add,X-My-ID)=${PJSIP_HEADER(read,X-My-ID)}) exten => 1234,n,Set(PJSIP_HEADER(add,X-My-Loc)=${PJSIP_HEADER(read,X-My-Loc)}) exten => 1234,n,Set(PJSIP_HEADER(add,X-My-Add)=${PJSIP_HEADER(read,X-My-Add)}) exten => 1234,n,Dial(PJSIP/1234,10)
n表示"next",即自动递增优先级,确保每一条指令都会被依次执行。PJSIP_HEADER(add,头部名)用于将指定值添加到 outgoing SIP消息的对应头部。
方式2:自动转发所有X-开头的自定义头部
如果需要批量转发所有X-前缀的自定义头部,无需逐个指定,可通过循环遍历所有入站头部实现:
; extensions.conf [default] exten => 1234,1,Set(HEADERS=${PJSIP_HEADER(all)}) exten => 1234,n,While($["${HEADERS}" != ""]) exten => 1234,n,Set(HEADER_PAIR=${CUT(HEADERS,\n,1)}) exten => 1234,n,Set(HEADERS=${CUT(HEADERS,\n,2-)}) exten => 1234,n,Set(HEADER_NAME=${CUT(HEADER_PAIR,:,1)}) exten => 1234,n,GotoIf($["${HEADER_NAME:0:2}" != "X-"]?continue) exten => 1234,n,Set(HEADER_VALUE=${CUT(HEADER_PAIR,:,2-)}) exten => 1234,n,Set(HEADER_VALUE=${STRIP(${HEADER_VALUE})}) exten => 1234,n,Set(PJSIP_HEADER(add,${HEADER_NAME})=${HEADER_VALUE}) exten => 1234,n(continue),EndWhile exten => 1234,n,Dial(PJSIP/1234,10)
PJSIP_HEADER(all)获取入站INVITE的所有头部,格式为头部名: 值每行一个。- 通过
CUT和While循环拆分每个头部对,判断前缀为X-后,将其添加到 outgoing 消息中。
注意事项
默认情况下Asterisk允许添加自定义头部,若你的PJSIP端点配置(pjsip.conf)有特殊限制,需确保配置未拦截自定义头部的传输。
内容的提问来源于stack exchange,提问作者User7723337
相关产品推荐
相关产品推荐

