我在Cloudfront后面使用一个S3桶,并启用了CORS。如果客户端发出带有Origin头的请求,那么S3(和Cloudfront)就会以 "Vary:Origin "头,但如果请求没有Origin,头,那么响应不包含任何Vary头。
这是有问题的,因为我在img标签中使用了来自cloudfront/s3的资源,在这种情况下,浏览器在没有Origin头的情况下发出了请求,然后又对上述图片发出了ajax请求。浏览器就会使用图片的缓存版本,没有Access-Control-Allow-Origin头,因此拒绝了请求。
有什么方法可以让S3总是返回 "Vary:Origin "头?
我开了一个账户就是为了回答你的问题,因为对于这种问题(以及一些相关的问题),周围很少有好的答案。
你所描述的问题主要发生在chrome中,FF和IE似乎很聪明,在这些情况下不会在AJAX和常规调用之间共享缓存。
让我们首先为未来的读者描述一下问题发生的原因。
<img>
<script>
在HTML5中,有一个叫做
的属性,可以被添加到标签中,以表示它们需要发送来源信息。 可能的值是
和
,这些都与所问问题无关,但正如文档中所说。
crossorigin
crossorigin='anonymous'
crossorigin='use-credentials'
默认情况下(也就是说,当没有指定属性时),根本不使用CORS。
https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_settings_attributes
因此,只需像这样创建你的图像标签
即可。
<img src='cloundfront.path' crossorigin='use-credentials'>
就这样吧。它相当晦涩难懂,所以我希望这个答案能够为一群人节省一些研究时间。