允许多个信任域名动态匹配,核心是用函数形式的 origin 配置实时校验请求 origin 是否在白名单中,匹配成功返回对应域名,否则拒绝;支持正则匹配子域名,且 credentials 为 true 时 origin 必须为具体值。

允许多个信任域名动态匹配,核心是不让 Access-Control-Allow-Origin 写死成单一字符串或通配符 *,而是根据请求头中的 Origin 值做实时判断,只对白名单内的域名返回对应响应头。
用函数形式的 origin 配置(推荐)
Express 的 cors 中间件支持把 origin 设为一个函数,接收请求的 origin 字符串和回调函数,由你决定是否允许该来源:
- 先定义可信域名数组,比如
['https://a.com', 'https://b.net', 'http://localhost:3000'] - 在
cors配置中传入函数,检查请求来源是否在列表中 - 匹配成功就调用
callback(null, true),否则报错或拒绝
示例代码:
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
const allowedOrigins = [
'https://a.com',
'https://b.net',
'http://localhost:3000'
];
app.use(cors({
origin: (origin, callback) => {
if (!origin || allowedOrigins.includes(origin)) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
}
}));
支持子域名通配的正则匹配
如果需要匹配 a.example.com、b.example.com 等同根子域,不能直接用 *.example.com(浏览器不认),但可以用正则动态生成允许的源:
- 在 origin 函数里用正则测试
origin是否符合模式,例如/^https?:\/\/[a-z0-9.-]+\.example\.com(:[0-9]+)?$/i - 匹配成功后,把原始
origin值原样返回(CORS 规范要求Access-Control-Allow-Origin必须精确等于请求的Origin,不能是通配符) - 注意:若需携带 cookie(
credentials: true),origin绝对不能设为*,必须是具体值或函数返回具体值
注意事项与常见坑
以下几点容易出错,务必留意:
-
Origin 为空时可能来自非浏览器环境(如 curl、Postman)或某些内嵌 WebView,建议加
!origin判断并按需放行或拒绝 -
协议、端口、子域名全部区分大小写且必须完全一致,
http://A.COM和https://a.com是两个不同源 -
如果启用了
credentials: true,后端必须返回具体域名,前端 fetch 也要加credentials: 'include',否则浏览器会直接拦截响应 -
预检请求(OPTIONS)会自动被
cors处理,无需额外写app.options(),除非你自定义了复杂逻辑










