amazon-web-services - API Gateway v2 未从 OPTIONS 调用返回 CORS 标头
问题描述
当我从在 localhost 上运行的网站发送 POST 时,得到了一个指向 Lambda 的 API Gateway v2,该 Lambda 遇到了 CORS 问题。作为故障排除的一部分,我正在使用 curl 模拟预检请求。它没有按我的预期工作。
这是我在 API 网关中的 CORS 设置(仅限开发,而不是 prd):
CORS 部分aws apigatewayv2 get-api --api-id=redacted
"CorsConfiguration": {
"AllowCredentials": false,
"AllowHeaders": [
"content-type"
],
"AllowMethods": [
"HEAD",
"OPTIONS",
"POST"
],
"AllowOrigins": [
"*"
],
"MaxAge": 600
},
我正在使用这个脚本来查询它:
source='localhost'
dest='https://redacted.execute-api.us-west-2.amazonaws.com/redacted/'
verb='POST'
echo $source $dest $verb
curl -I -X OPTIONS \
-H "Origin: ${source}" \
-H "Access-Control-Request-Method: ${verb}" \
-H "Access-Control-Request-Headers: origin" \
"${dest}"
回应是:
HTTP/2 204
date: Thu, 23 Sep 2021 18:03:25 GMT
apigw-requestid: GIMpJhH4PHcES5g=
通过阅读此处的 MDN 文档和此处的答案,我希望 API Gateway 能够返回其中包含的响应Access-Control-Allow-Origin
。但我什么也得不到。将源更改为包含http://
并没有改变结果(我不希望它会,我认为 CORS 在这种情况下只关心域)。
请注意,很多答案都涉及“您忘记部署它”——但 API Gateway v2 默认为“自动部署”,并且此实例使用该默认值——每次更改时都会部署它。
注意:我已经在我的 lambda 中设置'Access-Control-Allow-Origin': '*'
了"Content-Type": "application/json",
API 网关所指向的位置,但我认为这还没有达到那么远,所以 lambda 现在不是问题的一部分。我是不是误会了?
如何使用 curl 检查 AWS API Gateway v2 上的 CORS?
我还应该创建一个标签aws-api-gateway-v2
吗?它与 v1 有点不同,足以让 Terraform 使用不同的模块。
解决方案
这归结为被拒绝的标题。简短版本:API 网关中的任何被拒绝的标头都会导致 404。这是一个有效的curl
:
curl 'https://redacted.execute-api.us-west-2.amazonaws.com/redacted' -I \
-X 'OPTIONS' \
-H 'authority: redacted.execute-api.us-west-2.amazonaws.com' \
-H 'accept: */*' \
-H 'access-control-request-method: POST' \
-H 'access-control-request-headers: content-type' \
-H 'origin: http://localhost:8080' \
-H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36' \
-H 'sec-fetch-mode: cors' \
-H 'sec-fetch-site: cross-site' \
-H 'sec-fetch-dest: empty' \
-H 'referer: http://localhost:8080/' \
-H 'accept-language: en-US,en;q=0.9' \
--compressed
推荐阅读
- typeorm - MySQL typeORM中的复合主键
- python - 用他们的分数打印球员
- r - 如何在特定阈值后替换列其余部分的值?
- react-native - 我想在反应原生的选择器中显示 json 数据。我正在使用基于功能的组件而不是基于类。有什么解决办法吗?
- python - 为什么 Beautiful Soup 将“<”视为无效字符?
- ios - Objective C - 使用自己的样式从 HTML 文本更改属性字符串的字体
- javascript - 如何从 typescript/javascript 中的对象数组中提取具有值的特定键?
- junit - @DataJpaTest 期间自动装配的 ObjectMapper 为空
- android - 如何使用工具栏而不是操作栏将旧的导航抽屉片段代码升级为代码?
- reactjs - 分阶段实施 React,怎么可能?