AWS静态网站POST请求CORS错误排查:Origin不匹配
解决CORS源匹配错误(Access-Control-Allow-Origin带末尾斜杠)
核心问题定位
错误提示明确说明:预检请求返回的Access-Control-Allow-Origin头值是https://example.net/(带末尾斜杠),但你的请求源是https://example.net(无斜杠)。CORS对源的匹配是严格字符串匹配,哪怕仅差一个斜杠也会触发拦截。
逐一排查修复步骤
1. 修复API Gateway的CORS配置(优先级最高)
你提到配置CORS后保存的设置消失,这是配置未生效的典型表现:
- 进入API Gateway控制台,找到
/contact资源,点击启用CORS:- 确保
Access-Control-Allow-Origin填写https://example.net(绝对不能加末尾斜杠) - 勾选
Access-Control-Allow-Methods中的POST和OPTIONS - 确认
Access-Control-Allow-Headers包含Content-Type(适配你AJAX请求的contentType配置)
- 确保
- 配置完成后必须重新部署到prod阶段,API Gateway的CORS配置仅在部署后生效
- 如果仍无法保存设置,尝试删除现有
/contact资源,重新创建并配置CORS后部署
2. 修正Lambda函数的响应头
当前Lambda返回*虽不会导致斜杠问题,但为了严格匹配源,建议修改为指定值:
exports.handler = async (event) => { const response = { statusCode: 200, headers: { "Access-Control-Allow-Origin": "https://example.net", // 无末尾斜杠 "Access-Control-Allow-Headers": "Content-Type", "Access-Control-Allow-Methods": "POST, OPTIONS" }, body: JSON.stringify("提交成功") }; return response; };
注:若API Gateway已配置CORS,Lambda的响应头会与网关配置合并,确保两边源一致即可。
3. 检查CloudFront响应头策略
你使用的CORS-With-Preflight策略需确认源配置正确:
- 进入CloudFront控制台,找到你的响应头策略
- 查看
Access-Control-Allow-Origin的值,确保是https://example.net(无斜杠) - 若使用AWS托管策略,建议创建自定义策略,手动指定正确的源
4. 验证S3的CORS配置(辅助检查)
虽然请求目标是API Gateway,但仍需确保S3配置无冲突:
<CORSConfiguration> <CORSRule> <AllowedOrigin>https://example.net</AllowedOrigin> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedHeader>*</AllowedHeader> </CORSRule> </CORSConfiguration>
5. 客户端代码规范优化
将AJAX中的crossDomain: "true"改为布尔值true,虽非问题根源,但更符合语法规范:
$.ajax({ type: "POST", url: URL, dataType: "json", crossDomain: true, // 修改为布尔值 contentType: "application/json; charset=utf-8", data: JSON.stringify(data), // ... 其余代码 });
验证方法
修改配置后,重新提交表单,通过Chrome开发者工具网络标签检查:
- 找到
OPTIONS预检请求,查看响应头Access-Control-Allow-Origin是否为https://example.net(无斜杠) - 确认该值与请求头
Origin完全一致 - 预检请求通过后,再检查
POST请求的响应头是否符合要求
内容的提问来源于stack exchange,提问作者Luke McConnell
相关产品推荐
相关产品推荐

