如果你重定向用户使用浏览器302 Found
将根据其cache-control
头缓存所产生的图像标识的URL,并不会要求它的第二次。
为了防止浏览器缓存中标识的URL本身,你应该与它一起发送正确Cache-Control
头:
Cache-Control: private, no-cache, no-store, must-revalidate
因此,下一次它会发送请求到原始地址和将被重定向到一个新的签署的网址。
您可以使用signedUrl
method生成带knox
的签名url。
但不要忘记为每个上传的图像设置正确的标题。我建议您同时使用Cache-Control
和Expires
标头,因为某些浏览器不支持Cache-Control
标头,并且Expires
只允许您设置绝对过期时间。
第二个选项(通过您的应用程序流式传输图像)可以更好地控制情况。例如,您可以根据当前的日期和时间为每个响应生成Expires
标题。
但速度怎么样?使用签名的url有两个好处,可能会影响页面加载速度。
首先,你不会超载你的服务器。如果速度很快,则生成已签名的网址,因为您只是对您的AWS凭据进行哈希处理并且通过您的服务器流式传输图像,您需要在页面加载期间保持大量额外的连接。无论如何,除非你的服务器很难加载,否则它不会有任何实际的区别。
其次,浏览器在页面加载期间每个主机名只保留两个并行连接。因此,浏览器将在下载图像时并行解析图像。它还会阻止下载图像,阻止下载任何其他资源。
无论如何,要绝对确定你应该运行一些基准测试。我的回答是基于我对HTTP规范的知识以及我在网络开发方面的经验,但我从来没有试图以我自己的方式提供图像。直接从S3提供长缓存生存期的公共图像可以提高页面速度,如果您通过重定向完成,我相信情况不会改变。
您应该记住,通过您的服务器流式传输图像将带来Amazon CloudFront的所有优势。但只要你直接从S3提供内容,这两个选项都可以正常工作。
因此,有两种情况使用已签署的网址应该加速你的页面时:
- 如果你有一个单一页面上大量的图片。
- 如果您使用CloudFront提供图像。
如果你只有在每一页上几张图片,并直接从S3为他们提供服务,你可能不会看到任何差别。
重要更新
我进行了一些测试,发现我错了有关缓存。浏览器确实缓存了他们被重定向到的图片。但它将缓存的图像与它重定向到的网址相关联,而不是与原始网址相关联。因此,当浏览器第二次加载页面时,它会再次从服务器请求图像,而不是从缓存中获取图像。当然,如果服务器使用相同的重定向url进行响应,它会首次响应,浏览器将使用它的缓存,但对于已签名的url,情况并非如此。
我发现,迫使浏览器缓存标识的URL以及接收到的数据解决了这个问题。但我不喜欢缓存无效重定向网址的想法。我的意思是,如果浏览器以某种方式错过了图像,它会尝试使用缓存中的无效签名url再次请求它。所以,我认为这不是一个选择。
如果CloudFront的服务更快的图像,或者如果浏览器限制每个主机并行下载的数量,使用浏览器缓存的优势,通过你的服务器超出管道图像的所有缺点都无所谓。
它看起来像大多数社交网络通过隐藏其真实URL背后的一些私人代理解决了私人图像的问题。因此,他们将所有内容存储在公共服务器上,但没有办法在未经授权的情况下将url链接到私人图像。当然,如果您将在新标签中打开私密图片并将网址发送给您的朋友,他也可以看到图片。所以,如果它不适合你,那么最好使用Jonathan Ong's solution。
我会以你的答案为例。非常感谢。但是,如果你不介意你是否可以再帮助我一件事。使用AWS-SDK更好还是knox? –
从未尝试过aws-sdk。然而,Knox维护者更多地参与节点社区。 –
但是??然而你没有提到什么? –