OpenStack Swift基于前缀的临时URL无法正常工作问题
问题复现
执行前缀式临时URL生成命令:
swift tempurl --prefix-based GET 600 "/v1/AUTH_project/container/my/prefix/" "mykey12345"
得到返回结果:
/v1/AUTH_project/container/my/prefix/?temp_url_sig=abc0987&temp_url_expires=1758927814&temp_url_prefix=test/prefix/
拼接成完整访问URL后:
https://swift.example.com/object/v1/AUTH_project/container/my/prefix/testobject.txt?temp_url_sig=abc0987&temp_url_expires=1758927814&temp_url_prefix=test/prefix/
访问时返回401 Unauthorized: Temp URL invalid错误,但直接生成单对象的临时URL(如下)却能正常访问:
swift tempurl GET 600 "/v1/AUTH_project/container/my/prefix/testobject.txt" "mykey12345"
原因分析
- 请求路径不匹配:Swift临时URL的签名是基于请求的完整路径生成的。生成前缀URL时指定的路径是
/v1/AUTH_project/container/my/prefix/,但访问时的URL多了/object前缀,导致签名验证时路径不一致,直接触发401。 - temp_url_prefix参数错误:生成的URL中
temp_url_prefix=test/prefix/,但实际要访问的对象前缀是my/prefix/,参数值与实际前缀不匹配,也会导致临时URL验证失败。
解决方案
对齐生成路径与访问路径
确保生成临时URL时使用的路径和实际访问的路径完全一致。如果你的Swift集群访问路径确实包含/object前缀,生成命令要同步加上该前缀:swift tempurl --prefix-based GET 600 "/object/v1/AUTH_project/container/my/prefix/" "mykey12345"若集群标准路径就是
/v1/AUTH_project/...,则访问时不要额外添加/object,直接使用生成的路径拼接对象名:https://swift.example.com/v1/AUTH_project/container/my/prefix/testobject.txt?temp_url_sig=abc0987&temp_url_expires=1758927814&temp_url_prefix=my/prefix/修正temp_url_prefix参数
检查生成命令中的路径参数,确保--prefix-based对应的路径是正确的前缀(my/prefix/),避免生成的URL中出现错误的temp_url_prefix=test/prefix/。如果是因为命令参数错误导致的,调整路径后重新生成即可。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

