我自己用python写了一个第三方七牛的sdk,我看七牛的下载凭证中有这么一句话:
为 URL 签名之前,对 Path 部分(不含前导/符号,通常就是 Key 本身,即上例中的 sunflower.jpg)做一次 URL转义。
我用python的urllib.quote做转义(会把~转义成%7E)获取下载地址都没有问题,下载其他文件均正常。但是当下载一个key中带有~的文件时会显示download token auth failed 。后来我在quote这里做了一个replace,把%7E换成~,也就是不要让~转义掉,就正常了。是不是七牛的计算时也没有对~做转义?
文档当中的意思是,为了保证签名的正确性,如果私有资源文件名为
test~test.jpg
、域名为test.clouddn.com
,那么最好签名的时候最好是用http://test.clouddn.com/test%7Etest.jpg
去签名,同时访问的时候,用http://test.clouddn.com/test%7Etest.jpg?e=xxx&token=xxx
去访问;但是如果签名的时候使用
http://test.clouddn.com/test%7Etest.jpg
作为baseUrl签名,但是访问的时候用http://test.clouddn.com/test~test.jpg?e=xxx&token=xxx
那很大可能性就会报错了;推荐对文件名做utf-8的urlencode的主要目的还是防止特殊字符在一些情况下http请求发生错误的转义;本质上,如果特殊字符是utf-8的格式是可以不用额外的做urlencode的。