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


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

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

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

Author: twigg, 2013-10-07

3 answers

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

  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));
 14
Author: MonkeyZeus, 2018-09-28 12:36:12

В 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-файл загружен, независимо от имени файла или заголовков.

 2
Author: davidkonrad, 2013-10-07 13:11:54

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

    <a href="http://host.com/my_file.pdf?t=<?php time(); ?>">My File</a>

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

 -2
Author: Flavien, 2013-10-07 12:48:21