Файлы PDF в кэше Google Chrome

Я построил небольшое внутреннее приложение PHP / MySQL для размещения и сортировки документов. Все работает отлично, пока дело не доходит до обновления файла, в этом случае a .файл PDF. Когда пользователь обновляет .PDF новый файл находится на сервере, как и ожидалось, а старая версия удалена. Пользователь получает новую версию при условии, что они никогда не открывали старую версию.

теперь проблема.... Если пользователь открыл более старую версию .PDF в какой-то момент в прошлом они не получают новой версии когда ссылка нажата для просмотра документа, даже если его только новая версия фактически физически находится на сервере.

Я предполагаю, что браузер Google Chrome кэширует старую версию PDF где-то. Как я могу обойти это? Из-за количества пользователей и количества раз в день некоторые документы обновляются с просьбой к пользователям вручную очистить любой кэш не практично.

3 ответов


у вас действительно есть три варианта:

  1. изменить имя файла каждый раз, когда он обновляется
  2. всегда генерируйте HREF с параметром GET
  3. отправить информацию заголовка, сообщая браузеру всегда загружать свежие с сервера

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>

это должно обойти кэш.