我已经构建了一个小型的PHP / MySQL内部应用程序来托管和排序文档。在更新文件(在本例中为.PDF文件)之前,一切都很完美。当用户更新.PDF时,新文件将按预期位于服务器上,并删除旧版本。用户正在获取新版本,因为他们从未打开旧版本。
现在出现问题....如果用户在过去的某个时刻打开了旧版本的.PDF,当单击链接查看文档时,即使它只是新版本,它们也不会获得更新的版本版本实际上在服务器上。
我猜测Google Chrome浏览器正在某处缓存旧版本的PDF。我怎么能绕过这个?由于用户数量和每天更新一些文档的次数要求用户手动清除任何缓存是不切实际的。
答案 0 :(得分:15)
你真的有三个选择:
选项1 - 在100%的情况下都有效。维护可能很棘手
echo '<a href="files/pdfs/'.$row['FILENAME_FROM_DATABASE'].'">PDF</a>';
// Could produce something like:
// <a href="files/pdfs/filename_v5.pdf">PDF</a>
选项2 - 在99%的案例中有效
echo '<a href="files/pdfs/filename.pdf?q='.microtime(true).'">PDF</a>';
选项3 - 在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_PDF_FILE));
答案 1 :(得分:2)
在HTML5中,您可以强制浏览器不缓存某些域(或根本不缓存,或者使用缓存,如果可用等等) - 请参阅https://developer.mozilla.org/en-US/docs/HTML/Using_the_application_cache
将此添加到您的<!doctype html><head>
-section:
<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都被下载时,无论文件名或标题如何。
答案 2 :(得分:-2)
我将完成第三个选项,方法是将动态参数附加到将下载文件的链接,即:
<a href="http://host.com/my_file.pdf?t=<?php time(); ?>">My File</a>
那应该绕过缓存。