使用Kannel发送含#符号短信返回403不可路由问题如何解决
Kannel发送含#号短信403错误解决指南
是否和PHP脚本有关?
是,90%以上的这类报错都是PHP侧没有正确处理URL特殊字符导致的。#是HTTP URL中的保留字符,作为锚点标记使用,如果你是通过GET请求调用Kannel的HTTP接口,#及之后的内容不会被发送到Kannel服务端,Kannel收到的短信内容缺失,路由校验失败就会返回403 "Not routable. Do not try again."。
解决方法
- 对短信内容做URL编码
发送前使用PHP内置的urlencode()函数处理短信内容,#会被转义为%23,避免被截断,示例代码:
Kannel收到请求后会自动解码还原原始短信内容,不影响最终展示。// 原始短信内容 $content = '*100*1238#'; // 编码后再作为参数传入Kannel请求 $safe_content = urlencode($content); - 改用POST请求调用Kannel接口
GET请求参数拼接在URL中容易触发特殊字符问题,改为POST方式将参数放在请求体中提交,不需要额外编码也不会出现#被截断的问题,更适合发送包含特殊符号的短信。 - 检查Kannel配置
如果以上操作后仍然报错,需要检查Kannel的配置文件:- 确认路由规则没有拦截包含
#的短信内容 - 检查
allowed-prefix、denied-prefix等过滤规则没有限制USSD格式(*开头#结尾)的内容下发 - 确认对接的上游运营商网关允许发送含
#的短信内容
- 确认路由规则没有拦截包含
内容的提问来源于stack exchange,提问作者Abdusoli
相关产品推荐
相关产品推荐

