Google Chrome缓存PDF文件

qnzebej0  于 2023-09-28  发布在  Go
关注(0)|答案(3)|浏览(210)

我已经构建了一个小型的PHP/MySQL内部应用程序来托管和排序文档。所有工作都很完美,直到它涉及到更新文件,在这种情况下是一个.PDF文件。当用户更新.PDF时,新文件会按预期在服务器上,旧版本会被删除。如果用户从未打开过旧版本,则他们将获得新版本。
现在的问题是。如果用户在过去的某个时间点打开了较旧版本的.PDF,则当单击链接以查看文档时,他们不会获得较新版本,即使实际上只有新版本在服务器上。
我猜Google Chrome浏览器正在某个地方缓存旧版本的PDF。我该怎么解决这个问题?由于用户数量和每天更新一些文档的次数,要求用户手动清除任何缓存是不切实际的。

rlcwz9us

rlcwz9us1#

你有四个选择:
1.每次更新时更改文件名
1.总是通过添加动态GET参数来生成唯一的HREF

  • 使用文件的时间戳创建一个新的动态GET参数
  • 这使您可以获得缓存和在新文件可用时提供新文件的好处
  • 发送头信息告诉浏览器总是从服务器下载新鲜的
    选项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'));
pn9klfpd

pn9klfpd2#

在HTML5中,您可以强制浏览器not缓存某些域(或者根本不缓存,或者使用缓存(如果可用)等)-请参阅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都被下载时,无论文件名或标题如何。

8wigbo56

8wigbo563#

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

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

应该会绕过该高速缓存。

相关问题