Textlocal短链接API对接Cloud Storage签名URL出现MalformedSecurityHeader报错
问题排查结论
核心原因是云存储签名URL被二次URL编码,导致重定向后的请求参数不符合云存储的安全校验规则,触发MalformedSecurityHeader错误:
- 你传入
shorten_url的云存储签名URL本身已经是经过URL编码的合法链接,包含X-Goog-Signature/X-Amz-Signature这类带特殊字符的签名参数,以及%编码的保留字符 - 你使用
urllib.parse.urlencode处理请求参数时,会自动对传入的url参数值做二次编码,把原URL里的&、%、=等关键字符转义,导致最终Textlocal短链接绑定的目标URL结构被破坏,云存储收到请求后无法识别合法的签名头/参数,返回安全校验错误 - 普通链接因为没有复杂的编码后签名参数,即使二次编码大部分场景下也能被正常解析,所以不会报错
修复方案
调整shorten_url函数里的参数编码逻辑,避免对目标URL做二次编码,指定urlencode的safe参数,保留URL原生的特殊分隔符即可:
import urllib.parse import urllib.request import ssl import certifi def shorten_url(apikey, url): # 添加safe参数,保留URL原生的分隔字符不被转义 data = urllib.parse.urlencode({'apikey': apikey, 'url': url}, safe=':/?&=%') data = data.encode('utf-8') request = urllib.request.Request("https://api.textlocal.in/create_shorturl/") f = urllib.request.urlopen(request, data, context=ssl.create_default_context(cafile=certifi.where())) fr = f.read() return(fr)
验证步骤
- 调用修复后的接口生成短链接后,先在浏览器开发者工具的网络面板查看短链接的301/302重定向目标地址,确认和你传入的原始签名URL完全一致
- 如果仍有报错,检查Textlocal API是否存在URL长度限制,部分云存储签名URL长度可能超过短链接服务商的参数上限,可以在提交请求前先打印完整的请求body确认参数完整
内容的提问来源于stack exchange,提问作者Jasmine
相关产品推荐
相关产品推荐

