关于CDN鉴权配置功能字符转义的那些事!-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

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

熊熊君 2017-03-28 20:59:20 4887
       目前来说,防盗链最理想的方案就是开启“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. 本帖由楼主原创,未经授权,严禁转载!!!
关于c配置 关于c功能 鉴权配置 功能的那些事 鉴权功能
分享到
取消 提交回答
全部回答(3)
  • alex2019
    2018-10-13 22:56:32
    Re关于CDN鉴权配置功能字符转义的那些事!

    $file2 = rawurlencode("/data/第一泪.mp3");
    echo PrivateKey(urlencode_cdn($file2),CDN_H_DOMAIN,CND_H_KEY);
    0 0
  • 水彩lyp2223
    2017-09-13 11:05:13
    学习了
    0 0
  • 洵云
    2017-04-02 09:42:44
    您的无私奉献精神值得我们学习!向您致敬!
    0 0
添加回答
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

相似问题
最新问题
推荐课程