最新消息:本站所有跳转向bbs.ykit.cn的附件将全面停止,附件已转移到https://www.qingsj.com

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

CDN 有客 1603浏览

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

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

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

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

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

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

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

转载请注明:有客帮 » CDN鉴权配置功能字符转义的那些事