使用托管 CORS-With-Preflight 策略向 CloudFront 分发发出 OPTIONS 请求,返回 403

使用托管 CORS-With-Preflight 策略向 CloudFront 分发发出 OPTIONS 请求,返回 403

我有一个 CloudFront 发行版,其默认行为配置为允许任何 CORS 请求(包括预检请求)。但是,OPTIONS 请求将失败并出现 HTTP 403 错误(详细信息如下),这不是我所期望的。

我正在使用 AWS 管理的带预检功能的 CORS应允许所有 CORS 请求(包括预检(OPTIONS)请求)的策略:

(我不确定为什么“原产地请求政策”区域以黄色突出显示。)

政策详情:

我已经在行为中允许OPTIONS请求:

但是,当我发送选项请求时,CloudFront 将返回此错误:

$ curl --request OPTIONS --url https://d3qj3h7hjzomrd.cloudfront.net/ --header 'Origin: https://www.example.com'

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>AccessForbidden</Code>
    <Message>CORSResponse: This CORS request is not allowed. This is usually because the evalution of Origin, request method / Access-Control-Request-Method or Access-Control-Request-Headers are not whitelisted by the resource's CORS spec.</Message>
    <Method>OPTIONS</Method>
    <ResourceType>OBJECT</ResourceType>
    <RequestId>WH3SHHNDMJR03FWJ</RequestId>
    <HostId>4mr77QbpdUeaN/GZvaFiwX5urzZbo7VoW2IiG3Ziq1HikqcPoTZKZZRmibuNf4590YlCf46Wu6s=</HostId>
</Error>

(我已经格式化了 XML 以提高可读性。)

我需要做哪些改变才能允许 OPTIONS 请求?

答案1

过去一天我一直在与此作斗争,发现缓存策略也起了作用。使用提供的“缓存优化”,一些必需的标头会被阻止,您将从 OPTIONS 预检中收到 403 错误,并从 GET 中收到 CORS 错误。

要解决该问题,请制定如下所示的自定义缓存策略。

(抱歉,我是新手,所以在我达到 10 分之前无法插入图片)

行为设置

行为设置

自定义缓存策略

自定义缓存策略

S3 存储桶 CORS 策略

S3 存储桶 CORS 策略

答案2

我遇到了完全相同的问题,我想我已经设法找到了这种行为的原因。您的 CloudFront 配置似乎完全没问题。

事实证明,OPTIONS如果请求不包含Access-Control-Request-Method标头,AWS 将为每个请求返回 403。根据此MDN 文档这是完全合法的行为:

此标头是必需的,因为预检请求始终是 OPTIONS,并且不使用与实际请求相同的方法。

因此,您只需修改您的 curl 以包含此标题:

curl -v --request OPTIONS \
--url https://d3qj3h7hjzomrd.cloudfront.net \
--header 'Origin: https://www.example.com' \
--header 'Access-Control-Request-Method: GET'

相关内容