相当奇怪。
在我的 Web 应用中,我有一个指向存储在 S3 中的电子表格的链接。我之前下载过该文件。现在,我在 s3 中更新了该文件。
当我尝试从同一链接再次下载它时,我仍然获得以前的版本。
如果我清除缓存,它将下载较新的版本...
答案1
您可以通过两种方式解决此问题:
您可以告诉 Amazon 在检索到您的 URL 时如何设置
Cache-Control
标头。指定标头的方式Content-Type
与控制其他标头的方式相同。您可以将缓存时间缩短到更短的时间间隔。您可以控制链接到 S3 上的文件的网页的缓存,并修改指向 S3 文件的链接,以便在文件更改时不会从缓存中使用其内容。基本上,您只需
?version=1
在 URL 末尾添加一个。如果您将其更改为?version=2
(等等),浏览器将不会使用文件的缓存版本,因为 URL 不会精确匹配。
第二种方法允许您对 S3 文件使用积极缓存并避免传输浪费。但每次更改文件内容时,它都要求您修改链接到该文件的每个网页。
看降低您的 Amazon S3 账单欲了解有关这两种技术的更多信息,尽管您试图获得相反的效果。
答案2
是的。即使我没有使用 S3 作为存储,我也遇到了同样的问题。我有一个 Symfony2 应用程序,它提供本地文件的内容以供下载。URL 始终相同,因为我正在使用 PHP 获取文件的内容并将其发送到浏览器。如果我修改本地文件的内容,Firefox 和 IE 将收到最新的文件版本,但 Chrome 不会。我尝试设置缓存控制标头,但没用,Chrome 只是忽略它们。
关于我正在使用的标题的一些想法:
$response->headers->addCacheControlDirective('no-cache', true);
$response->headers->addCacheControlDirective('max-age', 0);
$response->headers->addCacheControlDirective('must-revalidate', true);
$response->headers->addCacheControlDirective('no-store', true);
如果我向 URL 添加一个随机版本号 (?version=randomIntByTime),Chrome 最终会保存文件的最新版本。为 Chrome 编写额外的代码很令人沮丧。
答案3
不,但您和 S3 之间可能存在另一个缓存设备。例如 Microsoft 的 ISA 服务器,它具有 Web 流量缓存功能,我曾多次看到它这样做。