如何在Node.js版Lambda中识别反馈表单的网站来源URL?
用Node.js实现Lambda识别反馈表单的网站来源
方法1:前端主动携带网站标识
前端提交表单时,在请求体中加入网站来源字段,可通过window.location.hostname自动获取当前域名,避免手动输入错误。
Lambda中直接从请求体提取该字段,示例代码:
exports.handler = async (event) => { // 解析API Gateway传入的请求体 const requestBody = JSON.parse(event.body); const { fullName, email, message, siteOrigin } = requestBody; // 构造邮件内容 const emailContent = `Full Name: ${fullName} Email: ${email} Message: ${message} Origin of URL: ${siteOrigin}`; // 调用SES发送邮件的逻辑(需确保Lambda有SES发送权限) // 示例:const ses = new AWS.SES({ region: 'us-east-1' }); // await ses.sendEmail({/* 邮件参数 */}).promise(); return { statusCode: 200, body: JSON.stringify({ message: '反馈提交成功' }) }; };
- 优势:实现简单,不受跨域或代理导致的头信息丢失影响
- 注意:前端需确保字段名与Lambda解析逻辑一致
方法2:通过请求头自动获取来源
利用浏览器自动携带的Origin或Referer请求头,Lambda中提取并处理域名部分:
exports.handler = async (event) => { // 从请求头提取来源信息 const headers = event.headers; let siteOrigin = headers.origin || headers.referer; // 提取纯域名(去除协议、路径等) if (siteOrigin) { const url = new URL(siteOrigin); siteOrigin = url.hostname; } else { siteOrigin = 'Unknown'; // 处理无来源的异常情况 } // 解析用户提交的表单数据 const requestBody = JSON.parse(event.body); const { fullName, email, message } = requestBody; // 构造邮件内容 const emailContent = `Full Name: ${fullName} Email: ${email} Message: ${message} Origin of URL: ${siteOrigin}`; // 调用SES发送邮件逻辑 // ... return { statusCode: 200, body: JSON.stringify({ message: '反馈提交成功' }) }; };
- 优势:前端无需额外修改,自动获取来源
- 注意:部分代理或跨域场景下,
Origin/Referer可能被隐藏,需确保API Gateway允许这些头传递到Lambda
安全校验(可选)
为防止恶意伪造来源,可将可信网站域名存入Lambda环境变量,提前校验:
// 从环境变量读取可信站点列表 const trustedSites = process.env.TRUSTED_SITES.split(','); if (!trustedSites.includes(siteOrigin)) { return { statusCode: 403, body: JSON.stringify({ message: '来源站点不被允许' }) }; }
内容的提问来源于stack exchange,提问作者csaju
相关产品推荐
相关产品推荐

