Кэширование сайта отключить

202
11 ноября 2018, 02:00

Всем привет. Есть сайт на codeighniher, прикол в следующем. Если, я что-то меняю в стилях или js, в отдельных файлах, то, чтобы получить изменение мне нужно обновить страницу с очисткой кэша (ctrl+f5 в chrome) .
Если просто обновить страницу то никаких изменений по сайту нету.
Если писать стили в самом html, то без проблем меняется информация простым f5.
В чем может быть проблема? Где копать? На всяких случай скидываю файл htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(index.php|js|images|stylesheets|robots.txt)
RewriteRule ^(.*)$ index.php?/$1 [L]
AddDefaultCharset utf-8
<Files *>
Header set Cache-Control: "private, pre-check=0, post-check=0, max-age=0"
Header set Expires: 0
Header set Pragma: no-cache
</Files> 
Answer 1

Если Nginx стоит перед Apache и настроен для быстрой отдачи статики (CSS, JS, картинки), и управление Apache даже не передается. Поэтому настройки из .htaccess не влияют на заголовки, а Nginx часто настраивают на длительное кеширование:

location ~* ^.+\.(jpg|jpeg|gif|png|css|js|bmp|txt)$ {
  access_log        off;
  expires           14d; # кеширование в браузере на 14 дней
  break;
}

Первое, что следует выяснить - какие именно заголовки ответа передаются с веб-сервера. Это можно сделать во вкладке Network в консоли разработчика Хрома или Сеть в Firefox. Далее фильтруем по маске .css или .js и обращаем внимание на заголовки:

  • Expires (недостаток - на клиенте может стоять неверное время) и
  • Cache-Control (лишен этого недостатка).

В инструментах разработчика Хрома, в столбце Size надписи from disk cache и from memory cache как раз указывают на загрузку ресурса из кеша. А опция Disable cache полностью отключает кеш, ресурсы всегда загружаются с сервера, но только пока открыты инструменты разработчика.

Через curl:

curl -I "http://site.ru/js/scrips.js"

Чтобы кеширования не было, должно стоять:

Cache-Control: no-cache, no-store, must-revalidate

или

Cache-Control: max-age=0

или Expires указывает на дату в прошлом (минус 1 год, например).

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

# Ставим заголовок для понимания
Header set BackServer "Apache"

Если настроить веб-сервер невозможно (как в заданном вопросе), для файла следует указать дату его модификации в виде GET-параметра, например, так:

<script src="/js/scrips.js?<?=date('ymdHis',
  filemtime($_SERVER['DOCUMENT_ROOT'] . '/js/scrips.js'))?>"></script>

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

READ ALSO
Нужна помощь с формой на сайте

Нужна помощь с формой на сайте

Нужно создать такую форму, которая при заполнении поля и нажатии на кнопку "далее" задаст новый вопрос пользователю, как тут в блоке "расчитайтестоимость...

166
HTML JS запретить ввод текста в INPUT

HTML JS запретить ввод текста в INPUT

Есть input type text в который при определенных условиях нужно запретить ввод текста

194
Json массив в HTML таблицу

Json массив в HTML таблицу

Есть json фаил с данными на 8000 строкЕго данные нужно перенести в HTML таблицу

196
Не работают CSS стили в Django

Не работают CSS стили в Django

Только начал изучать Django и столкнулся с проблемой: не применяются стили CSS ни на одной из страниц (homehtml и about

268