谷歌浏览器缓存PDF文件


Google Chrome Cache PDF files

我构建了一个小型的 PHP/MySQL 内部应用程序来托管和排序文档。在更新文件(在本例中为.PDF文件)之前,一切都可以完美运行。当用户更新.PDF时,新文件将按预期显示在服务器上,旧版本将被删除。用户正在获取新版本,前提是他们从未打开过旧版本。

现在的问题....如果用户在过去某个时候打开了旧版本的.PDF,则在单击链接以查看文档时,即使它只是服务器上实际物理上的新版本,他们也不会获得较新版本。

我猜谷歌浏览器正在某处缓存旧版本的PDF。我该如何解决这个问题?由于用户数量和每天的次数,某些文档被更新,要求用户手动清除任何缓存是不切实际的。

你在这里真的有四个选择:

  1. 每次更新时更改文件名
  2. 始终通过添加动态 GET 参数生成唯一的 HREF
  3. 使用文件的时间戳创建新的动态 GET 参数
    • 这使您可以获得缓存和在新文件可用时提供新文件的好处
  4. 发送标头信息,告诉浏览器始终从服务器下载新鲜内容

选项 1 - 适用于 100% 的情况。可能很难维护

echo '<a href="/path/to/'.$row['FILENAME_FROM_DATABASE'].'">PDF</a>';
// Could produce something like:
// <a href="/path/to/file_v5.pdf">PDF</a>

选项 2 - 适用于 99% 的情况

echo '<a href="/path/to/file.pdf?q='.htmlentities(microtime(true)).'">PDF</a>';

选项 3 - 适用于 99% 的情况

echo '<a href="/path/to/file.pdf?q='.htmlentities(filemtime('/path/to/file.pdf')).'">PDF</a>';

选项 4 - 适用于 99% 的情况

header("Pragma: public");
header("Cache-Control: maxage=1"); // <-- important
header('Expires: '.gmdate('D, d M Y H:i:s', time()+1).' GMT');
header('Content-type: application/pdf');
exit(file_get_contents('/path/to/file.pdf'));

在HTML5中,您可以强制浏览器缓存某些域(或根本不缓存,或者使用缓存(如果可用等等) - 请参阅 https://developer.mozilla.org/en-US/docs/HTML/Using_the_application_cache

将此添加到您的<!doctype html><head>部分:

<html manifest="my.cache">

在文档根目录(my.cache)上创建一个文件,其中包含以下内容:

CACHE MANIFEST  
CACHE  
# dont force any caching 
NETWORK:
#force downloads form your site not to use cache
your-site.com

这强制不缓存任何内容。

如果您有 pdf 下载的路径,请改用该路径(因此将缓存您站点中除 PDF 之外的其他文件)

在浏览器中尝试此操作。记得先清除缓存!:)当您发现每个PDF都被下载时,无论文件名或标题如何。

我将完成第三个选项,通过将动态参数附加到将下载文件的链接,即:

    <a href="http://host.com/my_file.pdf?t=<?php time(); ?>">My File</a>

这应该绕过缓存。