开发者社区> 问答> 正文

关于CDN鉴权配置功能字符转义的那些事!

       目前来说,防盗链最理想的方案就是开启“CDN鉴权”功能了。但是阿里家的很多产品,在你使用或开发的过程中总是有很多意想不到的大坑。你没看做,有时候是巨坑!楼主这次要讲的,就是关于“CDN鉴权”功能中的“字符转义”问题了。

       我们都知道文件名的构成包含“文件名+后缀名”,后缀名肯定不会有任何问题,因为他是全英文字母组成的。但是,大家有想过文件名出现特殊字符的情况么?我们不能保证所有的文件名都是纯英文字母组成的,实际环境中,总是会遇到有“汉字、特殊字符”组成的文件名,如果这时使用CDN鉴权的方式访问文件,则会报错(即找不到该文件)!这个问题我之前自己在开发的时候百思不得其解(因为阿里官方文档并没有提示有这类情况)当时真是郁闷了很长时间啊。要解决这个问题,我们就需要字符转义。

       什么是字符转义呢?简单的说就是,对字符串(往往包含特殊字符、汉字等)进行编码,这样就可以在所有的计算机上读取该字符串。我们举个例子:在 UTF-8 编码的环境中,我们用 UrlEncode 编码“阿里云”得到字符串“%e9%98%bf%e9%87%8c%e4%ba%91”。但是又有一个问题,负责编码的函数有很多,阿里到底是用的什么标准呢?原则上,都应该基于 RFC 3986 标准,但是显然还是有很多问题。

       这里我们以 php 和 js 两种语言的编码函数为例,同样在UTF-8下编码,可以发现有明显的不同:

urlencode():对 _-. 以外的字符都做了处理,并且对空格的编码和其他函数不一样;
urlencode() 和 rawurlencode():对 ~ 的处理也不一样
encodeURI():不会编码 除 _-. 外的 ~!*()'
encodeURIComponnect():不会编码 除 _-. 外的 ~!@#$&*()=:/,;?+'


       这里经过我的反复测试,发现标准应该与 js 中的 encodeURIComponent 函数相同。即 js 语言下,建议大家用 encodeURIComponent 函数进行特殊字符编码。而 php 语言下,显然要麻烦很多了,建议大家用 rawurlencode 函数编码,然后转义这些字符(我以数组的形式列出,方面大家调用):

array('%28'=>'(', '%2F'=>'/', '%3D'=>'=', '%21'=>'!', '%24'=>'$', '%26'=>'&', '%27'=>"'", '%40'=>'@', '%2C'=>',', '%3B'=>';', '%29'=>')');

P.S. 本帖由楼主原创,未经授权,严禁转载!!!

展开
收起
熊熊君 2017-03-28 20:59:20 5581 0
3 条回答
写回答
取消 提交回答
  • Re关于CDN鉴权配置功能字符转义的那些事!

    $file2 = rawurlencode("/data/第一泪.mp3");
    echo PrivateKey(urlencode_cdn($file2),CDN_H_DOMAIN,CND_H_KEY);
    2018-10-13 22:56:32
    赞同 展开评论 打赏
  • 学习了
    2017-09-13 11:05:13
    赞同 展开评论 打赏
  • 您的无私奉献精神值得我们学习!向您致敬!
    2017-04-02 09:42:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
构建智能化的视频系统 阿里云CDN的进化 立即下载
CDN数据化实践 立即下载
直播CDN-X - 白山直播CDN流传递链路优化 立即下载