Файлы PDF в кэше Google Chrome
Я построил небольшое внутреннее приложение PHP / MySQL для размещения и сортировки документов. Все работает отлично, пока дело не доходит до обновления файла, в этом случае a .файл PDF. Когда пользователь обновляет .PDF новый файл находится на сервере, как и ожидалось, а старая версия удалена. Пользователь получает новую версию при условии, что они никогда не открывали старую версию.
теперь проблема.... Если пользователь открыл более старую версию .PDF в какой-то момент в прошлом они не получают новой версии когда ссылка нажата для просмотра документа, даже если его только новая версия фактически физически находится на сервере.
Я предполагаю, что браузер Google Chrome кэширует старую версию PDF где-то. Как я могу обойти это? Из-за количества пользователей и количества раз в день некоторые документы обновляются с просьбой к пользователям вручную очистить любой кэш не практично.
3 ответов
у вас действительно есть три варианта:
- изменить имя файла каждый раз, когда он обновляется
- всегда генерируйте HREF с параметром GET
- отправить информацию заголовка, сообщая браузеру всегда загружать свежие с сервера
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));
в 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>
это должно обойти кэш.