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