gpt4 book ai didi

amazon-web-services - 加载AWS CloudFront文件时获取403(禁止)

转载 作者:行者123 更新时间:2023-12-03 20:17:51 26 4
gpt4 key购买 nike

我正在开发一个视频应用程序,并将文件存储在AWS S3上,使用像https://***.amazonaws.com/***这样的默认URL可以正常工作,但是我决定使用CloudFront,它可以更快地进行内容交付。

使用CF,我一直使用该URL 403 (Forbidden)获取https://***.cloudfront.net/***。我想念什么吗?

一切正常,直到我决定从CloudFront加载指向我的存储桶的内容为止。

有什么解决办法吗?

最佳答案

当使用检查传入的Referer: header 的存储桶策略来限制对S3内容的访问时,您需要进行一些自定义配置,以使CloudFront变得“聪明”。

重要的是要了解CloudFront被设计为行为良好的缓存。所谓“行为良好”,是指CloudFront设计为永远不会返回与原始服务器将返回的响应不同的响应。我相信您可以看到这是一个重要因素。

假设我在CloudFront后面有一个Web服务器(不是S3),并且我的网站经过设计,以便根据对Referer: header 或其他任何HTTP请求 header (例如User-Agent:)的检查返回不同的内容。根据您的浏览器,我可能会返回不同的内容。 CloudFront如何知道这一点,从而避免为用户提供某个页面的错误版本?

答案是,它无法分辨-它不知道这一点。因此,CloudFront的解决方案根本不将大多数请求 header 转发到我的服务器。我的Web服务器看不到的内容,无法响应,因此我返回的内容不会根据我没有收到的 header 而有所不同,这会阻止CloudFront基于这些 header 缓存并返回错误的响应。 Web缓存有义务避免为给定页面返回错误的缓存内容。

“但是等等。”你反对。 “我的网站取决于特定 header 中的值,以便确定如何响应。”是的,这很有意义...所以我们必须告诉CloudFront:

我需要您转发浏览器发送的Referer:User-Agent:或其他几个 header 之一,而不是仅根据请求的路径来缓存我的页面,并缓存响应以供其他请求使用,这些请求不仅包含相同内容路径,但您转发给我的额外 header 的值也相同

但是,当原始服务器为S3时,CloudFront不支持转发大多数请求 header ,因为静态内容不太可能变化,因此这些 header 只会导致它不必要地缓存多个相同的响应。

您的解决方案不是告诉CloudFront您使用S3作为来源。相反,将您的分发配置为使用“自定义”来源,并为其指定存储桶的主机名,以用作来源服务器的主机名。

然后,您可以配置CloudFront将Referer: header 转发到源,并且基于该 header 拒绝/允许请求的S3存储桶策略将按预期工作。

好吧,几乎和预期的一样。因为现在缓存的页面将基于路径+引用页面进行缓存,所以这将在某种程度上降低缓存的命中率。如果一个S3对象被站点的多个页面引用,则CloudFront将为每个唯一请求缓存一个副本。这听起来像是一个限制,但实际上,这只是适当的缓存行为的产物-无论转发到后端,几乎所有东西,都必须用于确定该特定响应是否可用于满足将来的请求。

有关将CloudFront配置为将要发送到您的原始服务器的特定 header 列入白名单,请参阅http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/distribution-web-values-specify.html#DownloadDistValuesForwardHeaders

重要提示:请勿转发您不需要的任何标题,因为每个变体请求都会进一步降低您的命中率。尤其是在将S3用作自定义来源的后端时,请勿转发Host: header ,因为这可能无法满足您的期望。在此处选择Referer: header ,然后进行测试。 S3应该开始看到标题并做出相应的反应。

请注意,当您删除存储桶策略以进行测试时,CloudFront将继续提供缓存的错误页面,除非您通过发送无效请求来刷新缓存,这会导致CloudFront在整个过程中清除所有与您指定的路径模式匹配的缓存页面。大约15分钟。试验时最容易做的就是使用新配置创建新的CloudFront发行版,因为发行版本身不收费。

从CloudFront查看响应 header 时,请注意X-Cache:(命中/未命中)和Age:(此特定页面被缓存多久)的响应。这些在故障排除中也很有用。

更新: @alexjs进行了重要观察:与其使用存储桶策略,而是将Referer: header 转发到S3进行分析-但这会损害您的缓存比率,其程度会随着资源在引用页面上的分布而变化- -您可以使用新的AWS Web Application Firewall服务,该服务允许您针对到CloudFront的传入请求强加过滤规则,以基于string matching in request headers允许或阻止请求。

为此,您需要将发行版连接到S3作为S3来源(正常配置,与我在上面的解决方案中建议的相反,带有“自定义”来源),并使用CloudFront的内置功能对S3的后端请求进行身份验证(因此,如果恶意参与者直接从S3请求,则无法直接访问存储桶内容)。

有关此选项的更多信息,请参见https://www.alexjs.eu/preventing-hotlinking-using-cloudfront-waf-and-referer-checking/

关于amazon-web-services - 加载AWS CloudFront文件时获取403(禁止),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34882125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com