我构建了一个小型的 PHP/MySQL 内部应用程序来托管和排序文档。在更新文件(在本例中为.PDF文件)之前,一切都可以完美运行。当用户更新.PDF时,新文件将按预期显示在服务器上,旧版本将被删除。用户正在获取新版本,前提是他们从未打开过旧版本。
现在的问题....如果用户在过去某个时候打开了旧版本的.PDF,则在单击链接以查看文档时,即使它只是服务器上实际物理上的新版本,他们也不会获得较新版本。
我猜谷歌浏览器正在某处缓存旧版本的PDF。我该如何解决这个问题?由于用户数量和每天的次数,某些文档被更新,要求用户手动清除任何缓存是不切实际的。
你在这里真的有四个选择:
- 每次更新时更改文件名
- 始终通过添加动态 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'));
在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>
这应该绕过缓存。