Referer
今天遇到个小问题,关于referer的,挣扎了半天,来记录一下。
问题描述
现在在做的项目是这样的,网页版已做完,其中一些接口数据是存储在阿里云OSS上的,并且在已完成的网页项目中都是读取的该json存储数据,但是在小程序中访问OSS的数据,一直报403 forbidden错误。且返回的xml报错是这样显示的:
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
于是查找OSS文档查看签名的问题,
因为:
在微信小程序中:
网络请求的 referer 是不可以设置的,格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版。
于是我认为是referer的问题。然后就尝试,尝试了一通不行,在OSS上面添加了referer白名单,仍旧不起作用。
想不通,于是继续跟其技术人员聊天,最后才知道是因为header中的Content-Type应设置为‘application-type’,而之前的项目由于没有设置这个header,JAVA代码中也没有set这个header所以没有出错,而到了小程序中其herader的Content-Type是默认设置的,而服务器JAVA代码中没有set导致其签名不一致。于是为了让网页版仍旧可以运行,在JAVA代码中判断referer的来源而对其添加header,而解决了这一问题。
有必要了解下referer
百科解释:HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。简而言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。Referer的正确英语拼法是referrer。由于早期HTTP规范的拼写错误,为了保持向后兼容就将错就错了。
HTTP_REFERER的用途
- 常见的一些应用场景有防盗链,统计文章有多少次是来自谷歌搜索结果,多少次来自百度搜索结果等。
- HTTP_REFERER可以伪造:比如QQ音乐应该就做了referer的设置,但是可以改变请求头去获取它的数据,具体实现已记不清。
最后,有遇到关于referer问题的朋友,留个言,让我们对referer有个更清楚的认识。