Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Http 缓存具有不同查询字符串(S3签名URL)的图像_Http_Caching_Amazon S3 - Fatal编程技术网

Http 缓存具有不同查询字符串(S3签名URL)的图像

Http 缓存具有不同查询字符串(S3签名URL)的图像,http,caching,amazon-s3,Http,Caching,Amazon S3,我试图弄清楚是否可以让浏览器缓存带有签名URL的图像 我想要的是为每个请求生成一个新的签名url(相同的图像,但带有更新的签名),但不要让浏览器每次都重新下载它 那么,假设缓存相关的头设置正确,并且除了查询字符串之外,所有URL都相同,那么有没有办法让浏览器缓存它 URL看起来像: http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297463 htt

我试图弄清楚是否可以让浏览器缓存带有签名URL的图像

我想要的是为每个请求生成一个新的签名url(相同的图像,但带有更新的签名),但不要让浏览器每次都重新下载它

那么,假设缓存相关的头设置正确,并且除了查询字符串之外,所有URL都相同,那么有没有办法让浏览器缓存它

URL看起来像:

http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297463
http://example.s3.amazonaws.com/magic.jpg?WSAccessKeyId=stuff&Signature=stuff&Expires=1276297500
我们计划将e-tags设置为md5sum,那么它是否至少会发现在这一点上它是相同的图像


我的另一个选择是跟踪上次发送url的时间,然后在旧url过期之前开始发送新url,但我不想处理会话信息。

浏览器将使用整个url进行缓存,包括请求参数。因此,如果更改请求参数,它将实际上是缓存中的一个新“密钥”,并且将始终下载该映像的新副本。这是广告服务领域的一种流行技术——在URL末尾添加一个随机数(或当前时间戳)作为参数,以确保浏览器始终返回到服务器以发出新请求


实现此功能的唯一方法是使URL保持静态,即使用Apache重写规则或某种代理。

对于S3签名的URL,我遇到了完全相同的问题。我提出的唯一解决方案是让URL在同一天过期。这并不理想,但至少可以在一段时间内提供缓存


例如,所有在4月份签署的URL,我将到期日设置为5月10日。所有在6月签署的URL都将在7月10日到期。这意味着签名的URL整个月都是相同的。

刚刚偶然发现了这个问题并找到了解决方法。以下是您需要做的:

  • 存储第一个url字符串(例如在
    localStorage
    中)
  • 下次收到img url时,只需检查它们的主url是否匹配(
    str1.split(“?”)[0]==str2.split(“?”)[0]
  • 如果是,则将第一个用作img
    src
    属性

  • 希望它能帮助其他人。

    您知道它是否至少会检查电子标签而不再下载它吗?只有当浏览器在缓存中找到文件时(如果原始文件具有ETag值),ETag头才会由浏览器发送到服务器。因此,如果它在缓存中找不到它(如果URL发生更改,它就不会这样做),那么请求中就没有ETag值可发送。URL重写规则将再次使S3签名无效,因为web服务器将自动提供一个未过期的链接。然后还可以将S3中的文件标记为“public”。(那么,访问这些文件不需要签名)