我在这里有一个独特的情况。
我们有一个托管用户上传媒体的域(已经应用了图像操作)(usermedia.com)。媒体存储在Amazon S3存储桶中,Cloudflare位于此存储桶前面。
如果用户请求图片,他们可能会浏览到https://usermedia.com/my-image-resize-200-200.jpg。
如果此图像存在,则会提供,否则Amazon S3会执行302重定向(通过路由规则)到https://app.com/generate/my-image-resize-200-200.jpg,生成已调整大小的图像,将其上载到S3,然后再将其重定向回{{3} 3}}。这次文件存在于S3中并被提供。
问题是当我们启用Cloudflare代理时 - 它会缓存重定向,因此如果媒体不存在,Cloudflare会陷入持续的重定向循环。我尝试过使用307重定向,但问题仍然存在。
有关如何解决此问题的任何想法?
答案 0 :(得分:0)
我有一个完全相同的设置和一些问题。我发现问题确实是clouldflare。当图像不存在时,S3返回307指向缩放器端点,这里的问题是cloudflare添加了缓存头(例如:cache-control:public,max-age = 691200),因为可能你已经在缓存选项卡选项Browser Cache Expiration set,所以当浏览器获得响应时它将缓存它(因为存在缓存控制头),因此下一个请求将从浏览器缓存中提供。
更新:
快速解决方案可能很简单。在cloudflare上将浏览器缓存过期设置为"尊重现有标头",这样cloudflare就不会添加使浏览器缓存响应的标头。如果您仍希望在本地缓存图像,只需在从调整大小脚本创建时直接在S3图像上设置缓存控制标题
navigator.push({
screen: 'Test',
sharedElements: [`image`],
animationType: 'slide-horizontal',
navigatorStyle
});
如果您有其他资源(例如css或javascript等),您可以从aws控制台为它们设置CacheControl标头,或者,如果您在某个文件夹中有它们,请说&#34 ; foo",你可以去Cloudflare,创建一个页面规则,并指示为" foo"下的所有文件设置浏览器缓存TTL。文件夹中。
我知道这是一个迟到的答案,但希望能帮助将来遇到同样问题的人
答案 1 :(得分:0)
目前我看到Cloudflare没有缓存307重定向。第一个查询:
第二次查询:
您可以在S3重定向规则中设置respose代码,如下所示:
<RoutingRules>
<RoutingRule>
<Condition>
<HttpErrorCodeReturnedEquals>403</HttpErrorCodeReturnedEquals>
</Condition>
<Redirect>
<HostName>app.com</HostName>
<HttpRedirectCode>307</HttpRedirectCode>
</Redirect>
</RoutingRule>
</RoutingRules>