如何获取API服务的请求来源网站域名?Node.js+React开发场景
问题解决:Node.js后端获取请求来源域名并实现白名单鉴权
你当前的问题出在错误地传入了API自身的地址作为请求来源参数,导致解析出的是API部署域名而非前端请求的真实来源域名。要获取请求的真实来源,需要从Node.js请求对象的HTTP头中提取,而非传入错误的参数。
核心原理
浏览器在发送请求时,会自动携带以下两个HTTP头标识请求来源:
Origin:跨域请求(CORS)中必带,格式为https://your-frontend-domain.comReferer:同域/跨域请求可能携带,格式为完整的请求来源URL(比如https://your-frontend-domain.com/page)
优先使用Origin,因为它更简洁且专门用于标识来源;Referer作为 fallback 方案。
修正后的实现代码
const { URL } = require('url'); // 推荐使用URL对象,替代已废弃的url.parse // 允许的域名白名单,替换成你的自有域名和本地地址 const ALLOWED_DOMAINS = ['your-frontend-domain.com', 'localhost', '127.0.0.1']; exports.checkDomain = (req, res, next) => { // 获取请求来源头 const origin = req.headers.origin; const referer = req.headers.referer; let sourceUrl; if (origin) { sourceUrl = origin; } else if (referer) { // 从Referer中提取域名部分 sourceUrl = new URL(referer).origin; } else { // 无来源头,直接拒绝请求 return res.status(403).json({ error: '非法请求:无来源标识' }); } try { const parsedUrl = new URL(sourceUrl); const sourceDomain = parsedUrl.hostname; // 校验域名是否在白名单内 if (ALLOWED_DOMAINS.includes(sourceDomain)) { // 校验通过,继续处理请求 next(); } else { res.status(403).json({ error: '非法请求:来源域名未被允许' }); } } catch (err) { // 解析URL失败,说明来源头格式异常 res.status(403).json({ error: '非法请求:来源格式无效' }); } };
代码说明
- 白名单配置:
ALLOWED_DOMAINS里放你允许的前端域名,比如生产环境的自有域名、本地开发的localhost/127.0.0.1 - 来源头获取逻辑:先取
Origin,没有的话用Referer的origin部分 - 域名解析:用
URL对象解析来源地址,提取hostname(即域名部分) - 鉴权逻辑:判断域名是否在白名单,通过则调用
next()继续处理请求,否则返回403禁止访问
你的原代码问题点
requestip参数传入的是API自身的路径/地址,而非请求来源,导致解析错误return Apikeys.includes(domain)之后的dns.lookup代码永远不会执行(return会直接终止函数)- 没有正确使用Node.js的
req对象获取请求头信息
使用方式
把这个中间件挂载到需要鉴权的API路由上,比如:
const express = require('express'); const app = express(); const { checkDomain } = require('./path/to/your/file'); // 对所有API路由应用鉴权 app.use('/api', checkDomain); // 或者单独对某个路由应用 app.get('/api/data', checkDomain, (req, res) => { res.json({ data: '授权通过的返回内容' }); });
内容的提问来源于stack exchange,提问作者Dannana Sai Ajith Kumar
相关产品推荐
相关产品推荐

