2014-01-24 27 views
9

我有CORS标头设置在S3上,而当一个浏览器发出CORS请求(即包括Origin报头),S3将所有正确的报头添加到响应,包括一个Vary标题。但是,如果请求不包含Origin标头,则该响应不包括Vary标头,这会使中间高速缓存(例如CDN)免费缓存响应,并在稍后的请求进入时提供该响应,即使稍后的请求添加一个Origin标题。获取S3总是包括在其响应一个Vary头部

如何让S3始终返回Vary表头?

+0

此问题也已在[AWS S3论坛](https://forums.aws.amazon.com/thread.jspa?messageID=555417򇦙) –

回答

4

为什么是啰嗦,但简短的回答是:你不能。无论如何,目前还没有。

[TL; DR]

在S3中,Vary不是用户可配置的报头。虽然S3可以提供CORS头文件,但CloudFront并未明确支持它。

如果您的最终目标是使用S3作为您的源提供来自CloudFront的支持CORS的内容,我最终通过部署位于S3和CloudFront之间的应用程序来解决此问题,该应用程序代理请求并始终添加将CORS标头更正为S3的响应,以便CloudFront缓存正确的数据。

优点:

  • CloudFront的缓存CORS响应头与S3的数据一起。
  • CloudFront继续以100%的性能工作。
  • 代理应用程序非常小,可以在t1.micro上运行。

缺点:

  • 没有那么简单,因为S3 + CloudFront的正常工作,共同为CORS请求。
  • 编写和部署应用程序。
+0

上报告过其实,如果您看一下“相关“的问题,你会看到几个问题,包括答案。 –

+0

我没有使用CloudFront。我没有看到任何“相关”问题,解释如何让S3总是发送一个'Vary'头。 –

+0

在这种情况下,答案是“否”。您不能强制S3始终发送Vary标题。有关响应的更多信息,请参阅http://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonResponseHeaders.html和http://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html。 S3返回的标头。 –