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