微信小程序不校验域名的本质是跳过服务器域名合法性检查,而跨域问题则需要通过配置服务器CORS、使用云函数中转或开发环境代理来解决。 先区分这两个概念:不校验域名是开发工具里的一个开关,跨域是浏览器/小程序的安全机制,很多人把两者混为一谈,导致配置了一堆域名还是报错。
微信小程序不校验域名,开发环境和真机调试怎么设置?
开发工具里的“不校验合法域名”开关在哪?
微信开发者工具默认会对 wx.request 的URL做域名校验,只有在小程序后台配置过的域名才能正常请求,但开发阶段可以临时关闭这个限制。
- 打开微信开发者工具,点击右上角【详情】按钮。
- 在弹出的面板中,找到【本地设置】选项卡。
- 勾选 “不校验合法域名、web-view(业务域名)、TLS 版本以及 HTTPS 证书”。
- 重新编译后,请求任意HTTPS接口都不会再报“不在以下request合法域名列表中”的错误。
注意,这个开关只对模拟器和真机调试模式生效,如果你用“真机预览”扫码,手机端依然会校验域名,真机预览的正确做法是在小程序后台添加域名,或者使用“开发版”或“体验版”时,在“项目设置”中勾选“不校验合法域名”。
真机预览时怎么绕过域名校验?
有时候客户急着看效果,后台域名还没备案,这时候可以走临时路径:
- 在微信公众平台小程序后台,进入【开发管理】-【开发设置】-【服务器域名】。
- 如果你有测试服务器,临时把域名加进去(注意需要HTTPS证书)。
- 或者,让客户用微信的“真机调试”功能,配合开发者工具里的“不校验”开关,同一WiFi下扫码调试。
但这种方式仅限于开发测试,正式发布前必须配置好合法域名,行业共识认为,长期依赖“不校验域名”是危险的,因为线上环境一旦有非法请求,微信直接拦截。
微信小程序跨域问题,为什么会出现?
小程序的运行环境是JavaScript,但它的网络请求是微信原生提供的,理论上不存在浏览器那样的跨域限制,那为什么开发者还会碰到跨域报错?
跨域报错的两种常见场景
- 场景A:开发环境中,请求本机或局域网接口,比如电脑上跑着
http://localhost:8080,小程序请求它,会报“url not in domain list”或“网络错误”,这不是跨域,而是域名校验问题。 - 场景B:使用H5页面或WebView组件,小程序内嵌H5时,H5里的fetch或XMLHttpRequest会受到浏览器同源策略限制,这才真正产生跨域。

如果是场景B,需要把H5部署在支持CORS的服务器上,或者用小程序原生的web-view配合业务域名配置。
真跨域 vs 假跨域,怎么判断?
看报错信息:
- 如果提示“域名不合法”或“不在request合法域名列表中”,这是域名校验问题,不是跨域。
- 如果提示“Access-Control-Allow-Origin”或“CORS error”,这是真正的跨域问题,多出现在H5页面或小程序的
web-view中。 - 如果提示“无法连接到服务器”,可能是网络不通或HTTPS证书问题。
大概有相当一部分开发者把域名校验错误误认为跨域,白白折腾了CORS配置。
微信小程序跨域问题,怎么解决?
这里不讨论“不校验域名”这个临时开关,因为线上环境根本用不到,主要讲实际可行的方案。
后端开启CORS(适用H5和小程序间接请求)
如果小程序里加载了H5页面,H5需要调接口,那么后端必须返回CORS响应头,常规配置如下(以Nginx为例):
add_header Access-Control-Allow-Origin ;
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'Content-Type, Authorization';
注意,Access-Control-Allow-Origin不要直接写,如果你需要携带Cookie,必须指定具体域名,对于小程序本身,wx.request不受CORS限制,所以这个方案只针对H5场景。
使用云函数中转(推荐,不需要域名)
云开发是微信自带的,云函数调用HTTP请求时没有任何域名限制,你可以在云函数里用axios或request去请求第三方接口,然后返回给小程序。
- 在开发者工具中新建云函数,命名为
proxy。 - 在
index.js中写一个简单的转发逻辑:
const cloud = require('wx-server-sdk') cloud.init() const axios = require('axios') exports.main = async (event) => { const { url, method, data } = event const res = await axios({ url, method, data, headers: event.headers || {} }) return res.data }
小程序端调用:
wx.cloud.callFunction({
name: 'proxy',
data: {
url: 'https://api.example.com/list',
method: 'GET'
}
})
这个方案对开发者特别友好,因为它彻底绕开域名配置和跨域问题,云函数本身就是HTTPS地址,微信不校验它的域名,近年来,不少创业团队和个人开发者都在用云函数做数据聚合,省去服务器备案和域名管理的成本。
通过本地代理转发(仅开发环境)
开发调试时,可以用Charles或Fiddler抓包工具做代理转发,具体操作:
- 在开发者工具里,将请求地址指向代理工具监听的端口,比如
http://localhost:8888。 - 代理工具再转发到真实服务器。
- 同时保持开发者工具的“不校验合法域名”开启。
这种方式适合接口频繁变动、后端联调阶段,但注意,这种代理不会解决HTTPS证书校验,如果目标接口是自签名证书,还会报错。
把请求改成小程序原生API或WebSocket
有时候跨域问题是因为前端用了浏览器专用的fetch或axios,在小程序里,换成wx.request就不会有CORS概念,同样,如果H5页面需要通信,尽量用wx.miniProgram.postMessage或URL参数传参,而不是直接跨域调用。
微信小程序跨域配置,有哪些坑?
坑1:以为“不校验域名”能用在生产环境
线上小程序一旦发布,所有wx.request请求的域名必须在小程序后台白名单内,而且微信要求必须HTTPS,不支持IP地址和端口,如果不想绑定域名,只能走云函数或者云托管。
坑2:CORS配置了还是报错
常见原因包括:
- 后端没有处理
OPTIONS预检请求,直接返回500。 Access-Control-Allow-Headers漏掉了自定义头,比如Authorization。- 后端同时设置了多个
Access-Control-Allow-Origin,浏览器会忽略。

排查方式:在浏览器打开H5页面,打开控制台Network面板,查看请求的头信息是否包含Access-Control-Allow-Origin,如果没有,就是后端没配好。
坑3:把HTTP和HTTPS混用
小程序强制HTTPS,但本地开发时经常用http://localhost,开发者工具允许在“不校验域名”时访问HTTP接口,但真机不行,如果你遇到“tls版本过低”或“证书无效”的报错,多半是服务器TLS配置过旧,微信要求不低于TLS 1.2。
坑4:web-view的域名校验
web-view组件里的业务域名同样需要在后台配置,一次最多添加200个,如果你在H5里调接口,也要确保H5服务器支持CORS,不过好消息是,web-view页面本身不受小程序域名限制,它只校验加载的页面域名,页面内发的请求走浏览器规则。
微信小程序不校验域名,常见问题解答
Q:微信小程序不校验域名后,为什么还是提示网络出错?
如果已经勾选“不校验合法域名”,但请求仍失败,原因通常是:
- 请求的接口是HTTP明文协议,而微信模拟器在部分系统上禁止HTTP访问。
- 请求地址写的是
localhost,但真机调试时localhost指向手机自身,不是电脑。 - 后端服务没有启动,或者防火墙拦截。
解决办法:用电脑IP(比如http://192.168.1.10:8080)代替localhost,并确保手机和电脑在同一局域网。
Q:线上小程序如何在不配置域名的情况下请求第三方API?
将第三方API调用放在云函数里,这是目前最轻量的方案,云函数自动分配HTTPS域名,不需要你在后台配置任何东西,如果第三方API数量多,还可以在云函数里做请求缓存,降低延迟,这种方案的代价是云函数计费,不过免费额度对于个人项目足够用。
Q:H5页面在小程序里跨域,怎么区分该配CORS还是业务域名?
业务域名是让web-view能加载H5页面的前提,如果H5页面加载成功,但页面内的AJAX请求失败,那就是CORS配置问题。业务域名管页面加载,CORS管接口请求,如果H5页面完全打不开,先检查业务域名,如果页面打开但数据加载不出来,再去配CORS,据微信官方文档,业务域名校验包括ICP备案和HTTPS证书,缺一不可。
