目前来说,防盗链最理想的方案就是开启“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. 本帖由楼主原创,未经授权,严禁转载!!!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。