Скачивание закешированного файла

Некий PHP-скрипт генерирует .xls файл - счёт по заказу. Если его скачать, внести изменения в заказ и перегенерировать .xls, то файл соответственно изменяется с учётом изменений, однако браузер "скачивает" первоначальную версию файла, делая вид, что скачивает новую.

Проходит около часа без всяких изменений заказа и браузер скачивает уже нормальный новый .xls файл.

Отсюда мысли о неудалённом кеше.

Вопрос: Кеш ли это? Как можно генерировать файл .xls указав, что кеш надо потереть? Как можно скачивать файл, указав, что надо скачать именно новый, не закешированный файл? Варианты с изменением имени файла (с добавлением UNIX метки) не подходят по условию задачи.


Ответы (1 шт):

Автор решения: Вадим Александру

Достаточно передать заголовок Cache-Control: no-cache

Вариант 1: Настроить заголовки посредством вашего веб серверка

К примеру для nginx:

location ~* \.(?:xls)$ {
    expires -1;
}

Apache2

<filesMatch "\.(xls)$">
  FileETag None
  <ifModule mod_headers.c>
     Header unset ETag
     Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"
     Header set Pragma "no-cache"
     Header set Expires "Wed, 11 Jan 1984 05:00:00 GMT"
  </ifModule>
</filesMatch>

Работает как в файле .httaccess так и в вашем конфиге

Вариант 2: Обрабатывать запрос к файлу средствами самого php, К примеру по запросу на адресс example.com/xls

И отдавать сам файл к примеру таким образом

header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
header("Content-Disposition: attachment;filename=\"filename.xlsx\"");
header("Cache-Control: max-age=0");
→ Ссылка