Отключение кеширования страниц не отключает кеширование ресурсов?

Я использовал HTML-теги meta для отключения кеша, пока не узнал, что это работает только в том случае, если файл обслуживается локально, поэтому я отключил кеш с помощью рекомендуемого использования заголовков, поместив это вверху моих страниц:

header("Cache-Control: no-cache, no-store, must-revalidate");
header("Pragma: no-cache");
header("Expires: 0");

На что я не могу найти ответа и может быть глупо спрашивать, но это тоже не отключает кеширование ресурсов, не так ли? Я был в своих инструментах разработчика и смотрел на вкладку сети и заметил, что страница каждый раз загружалась свежей, но такие ресурсы, как CSS и Javascript, все еще загружались из кеша, что заставило меня поверить, что предотвращение кеширования страницы также не означает предотвратить кэширование ресурсов страницы, но я не знаю, правда ли это. Я добавил несколько версий к ресурсам, например:

<link rel="stylesheet" href="css/style.css?version=1">

Это остановило кэширование ресурса, чего я хотел, но затем, прочитав еще немного, оказалось, что можно использовать дополнительные заголовки для нацеливания на определенные форматы файлов и предотвращения их кэширования, что даст те же результаты, что и версионирование, хотя и другим способом.

Правильно ли я понимаю это и / или смешивание методов - плохая практика?


person Waxi    schedule 22.02.2017    source источник
comment
Может быть, вы кешируете на уровне веб-сервера? В IIS у вас есть эта опция, почти наверняка и другие   -  person Oscar    schedule 22.02.2017
comment
для приложения: http://httpd.apache.org/docs/current/mod/mod_expires.html   -  person    schedule 22.02.2017


Ответы (1)


Ваши наблюдения и понимание верны. Например, когда вы устанавливаете заголовки кеширования в своем php, они действительны только для этой страницы. Посмотрите на это с точки зрения браузера:

  • Страница запроса - получить ответ с инструкцией не кешировать его
  • Разобрать полученную страницу, получить URI ресурсов (css, js, img и т. Д.)
  • Отправить запрос для каждого из этих ресурсов - получить ответ

Если в этом последнем ответе нет заголовков, указывающих браузеру не кэшировать их, они будут кэшироваться в соответствии со стандартными правилами.

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

Другой включает изменение конфигурации вашего веб-сервера, чтобы указать, что определенные типы ресурсов (имена файлов, расширения, типы контента и т. Д.) Не должны кэшироваться. Например, следующее в конфигурации Apache указывает, что кеширование не должно выполняться вообще ни для каких файлов:

<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>

Обратите внимание, что идея кеширования двоякая:

  • позволяют клиентам быстрее получать ответы, используя ранее загруженную локальную копию ресурса
  • снизить нагрузку на ваш сервер за счет меньшего количества ответов

Поэтому будьте осторожны с отключением кеширования. Вы можете (в крайнем случае) убить свой сервер, если серьезно недооцените количество запросов, которые вам нужно обработать.

person Aleks G    schedule 22.02.2017
comment
Спасибо за POV браузера, который мне прояснил. Я не уверен, почему я думал, что первоначальные инструкции не кэшировать будут распространяться на все остальное на странице, но теперь я понимаю! - person Waxi; 23.02.2017
comment
просто чтобы добавить, даже если вы это сделаете, файлы все равно могут быть кэшированы в разных местах, например, у вашего интернет-провайдера. - person ; 23.02.2017
comment
@nogad правильно. Некоторые прокси могут игнорировать или даже удалять заголовки кеширования. - person Aleks G; 23.02.2017