背景
一个获取列表信息的接口,在我在浏览器可以正常获取数据,但小程序的接口返回失败:/1invalid_request
定位问题
在CGI中有域名白名单校验:
checkhost()
函数会校验请求头中的referer
字段的域名是否在白名单中。
//白名单
$config['whitehost'] = array(
'http://www.aa.cn',
'http://www.bbb.cn',
'https://www.ccc.cn',
.....);
//checkhost() 判断
if ($refer && (strpos($refer, $whiteHosts[$i]) !== false)) {
...
return true;
}else{
die('/1invalid_request');
}
如果校验白名单失败,则返回/1invalid_request
那么,就可能是小程序referer
有问题了。
我对比了一下PC 和 小程序调用此接口的referer
PC的请求头:
Referer: https://www.myhost.cn/
小程序的请求头:
Referer: https://servicewechat.com/{appid}/{version}/page-frame.html
咦,微信小程序这里怎么和想象的不一样?
解决方案
搜索一下,你就知道
在微信小程序中:
网络请求的 referer 是不可以设置的,格式固定为 https://servicewechat.com/{appid}/{version}/page-frame.html,其中 {appid} 为小程序的 appid,{version} 为小程序的版本号,版本号为 0 表示为开发版。
参考:https://blog.csdn.net/wl1769127285/article/details/53690640
原来如此,微信小程序有自带的 referer, 且不可修改
只需要将
https://servicewechat.com
设置到域名白名单中即可:
$config['whitehost'] = array(
'http://www.aa.cn',
'http://www.bbb.cn',
'https://www.ccc.cn',
'https://servicewechat.com'//微信小程序
.....
);
其他平台的referer格式
平台 | referer | 备注 |
---|---|---|
微信小程序 | https://servicewechat.com/{appid}/{version}/page-frame.html | |
头条抖音 | https://tmaservice.developer.toutiao.com | |
百度小程序 | https://smartapps.cn/{appKey}/{version}/page-frame.html | 百度小程序请求referer调整 |
支付宝 | https://你的appid.hybrid.alipay-eco.com | 蚂蚁开发文档 |
参考:
各平台白名单总结
百度小程序请求referer调整
微信小程序——网络请求之关于referer
谈谈网站防盗链
浅谈网站防盗链技术