背景
一个获取列表信息的接口,在我在浏览器可以正常获取数据,但小程序的接口返回失败:/1invalid_request
定位问题
HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。
在后台业务中有域名白名单校验:
checkhost()函数会校验请求头中的referer字段的域名是否在白名单中。
//白名单
$config['whitehost'] = array(
'https://www.appblog.cn',
'https://www.yezhou.me',
.....);
//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(
'https://www.appblog.cn',
'https://www.yezhou.me',
'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,但是微信小程序为什么不设置Access-Control-Allow-Origin也可以实现跨域请求?
跨域请求限制是浏览器做的事情,而小程序的『浏览器』是微信,它想限制就限制不想限制就不限制




