Как очистить кеш в поле
Обновлено: 21.11.2024
Синтаксис
Директивы кэширования соответствуют приведенным ниже правилам проверки:
- Директивы кэширования нечувствительны к регистру. Однако рекомендуется использовать строчные буквы, поскольку некоторые реализации не распознают директивы в верхнем регистре.
- Несколько директив разделяются запятыми.
- Некоторые директивы имеют необязательный аргумент.
Директивы кэширования
В следующей таблице перечислены стандартные директивы Cache-Control:
Запрос | Ответ |
---|---|
максимальный возраст | максимальный возраст |
максимальный возраст | - |
минимальная свежесть | - |
- | s-maxage |
без кэша< /td> | без кэша |
без сохранения | без- хранить |
без преобразования | без преобразования |
- | |
- | < td align="left">обязательная повторная проверка|
- | прокси-повторная проверка | < /tr>
- | нужно понимать |
- | частный |
- | общедоступный |
- | неизменяемый |
-< /td> | устарело при повторной проверке |
устарело при ошибке | stale-if-error |
Примечание. Проверьте таблицу совместимости на наличие их поддержки; пользовательские агенты, которые их не распознают, должны их игнорировать.
Словарный запас
В этом разделе определяются термины, используемые в этом документе, некоторые из которых взяты из спецификации.
Реализация, содержащая запросы и ответы для повторного использования в последующих запросах. Это может быть как общий кеш, так и частный кеш.
Кэш между исходным сервером и клиентами (например, прокси, CDN). Он сохраняет один ответ и повторно использует его для нескольких пользователей, поэтому разработчикам следует избегать хранения персонализированного содержимого для кэширования в общем кэше.
Кэш, существующий в клиенте. Его также называют локальным кешем или кешем браузера. Он может хранить и повторно использовать персонализированный контент для одного пользователя.
Сохранять ответ в кеше, если ответ можно кэшировать. Однако кэшированный ответ не всегда повторно используется как есть. (Обычно "кэш" означает сохранение ответа.)
Повторно использовать кешированные ответы для последующих запросов.
Спросите исходный сервер, актуален ли сохраненный ответ. Обычно повторная проверка выполняется с помощью условного запроса.
Указывает, что ответ свежий. Обычно это означает, что ответ можно повторно использовать для последующих запросов в зависимости от директив запроса.
Указывает, что ответ устарел. Обычно это означает, что ответ нельзя повторно использовать как есть. Хранилище кеша не требуется для немедленного удаления устаревших ответов, потому что повторная проверка может изменить ответ с устаревшего на новый.
Время, прошедшее с момента создания ответа. Это критерий того, является ли ответ свежим или устаревшим.
Директивы
В этом разделе перечислены директивы, влияющие на кэширование, — как директивы ответа, так и директивы запроса.
Указания по ответу
максимальный возраст
Директива ответа max-age=N указывает, что ответ остается актуальным в течение N секунд после создания ответа.
Указывает, что кеш может хранить этот ответ и повторно использовать его для последующих запросов, пока он свежий.
Обратите внимание, что max-age — это не время, прошедшее с момента получения ответа; это время, прошедшее с момента создания ответа на исходном сервере. Таким образом, если другие кэши — на сетевом маршруте, используемом ответом — хранят ответ в течение 100 секунд (указано с помощью поля заголовка ответа Age), кэш браузера вычтет 100 секунд из срока его актуальности.
s-maxage
Директива ответа s-maxage также указывает, как долго ответ является свежим (аналогично max-age ), но она специфична для общих кешей, и они будут игнорировать max-age, когда он присутствует.
без кеша
Директива ответа без кеша указывает, что ответ может храниться в кеше, но перед каждым повторным использованием ответ должен проверяться исходным сервером, даже если кеш отключен от исходного сервера.
Если вы хотите, чтобы кэши всегда проверяли наличие обновлений контента при повторном использовании сохраненного контента, используйте директиву no-cache. Для этого требуется, чтобы кеш повторно проверял каждый запрос на исходном сервере.
Обратите внимание, что "без кэширования" не означает "не кэшировать". no-cache позволяет кешам сохранять ответ, но требует от них повторной проверки перед повторным использованием. Если смысл «не кэшировать», который вы хотите, на самом деле означает «не сохранять», тогда директива no-store — это директива для использования.
необходимо перепроверить
Директива ответа must-revalidate указывает, что ответ может быть сохранен в кеше и может повторно использоваться, пока он свежий. Если ответ устаревает, его необходимо проверить на исходном сервере перед повторным использованием.
Обычно must-revalidate используется с max-age .
прокси-повторная проверка
Директива ответа proxy-revalidate эквивалентна must-revalidate , но только для общих кэшей.
нет магазина
Директива ответа no-store указывает, что любые кэши любого типа (частные или общие) не должны хранить этот ответ.
частное
Директива private response указывает, что ответ может храниться только в частном кеше (например, в локальном кеше браузеров).
Если вы забудете добавить личное к ответу с персонализированным содержанием, этот ответ может быть сохранен в общем кеше и в конечном итоге повторно использоваться несколькими пользователями, что может привести к утечке личной информации.
общедоступно
Директива общедоступного ответа указывает, что ответ может храниться в общем кэше. Ответы на запросы с полями заголовка Authorization не должны храниться в общем кэше; однако директива public приведет к тому, что такие ответы будут храниться в общем кэше.
Как правило, когда страницы находятся под базовой аутентификацией или дайджест-аутентификацией, браузер отправляет запросы с заголовком авторизации. Это означает, что доступ к ответу контролируется для пользователей с ограниченным доступом (у которых есть учетные записи) и, по сути, он не подлежит совместному кэшированию, даже если он имеет max-age .
Вы можете использовать директиву public, чтобы снять это ограничение.
Обратите внимание, что s-maxage или must-revalidate также разблокируют это ограничение.
Если в запросе нет заголовка Authorization или вы уже используете s-maxage или must-revalidate в ответе, вам не нужно использовать public .
нужно понять
Директива ответа must-understand указывает, что кэш должен хранить ответ только в том случае, если он понимает требования к кэшированию на основе кода состояния.
необходимо понимать, что для резервного поведения следует использовать правило "не сохранять".
Если кеш не поддерживает must-understand , он будет проигнорирован. Если также присутствует no-store, ответ не сохраняется.
Если кеш поддерживает must-understand , он сохраняет ответ с пониманием требований к кешу на основе его кода состояния.
без преобразования
Некоторые посредники изменяют контент по разным причинам. Например, некоторые конвертируют изображения, чтобы уменьшить размер передаваемых файлов. В некоторых случаях это нежелательно для поставщика контента.
no-transform указывает, что любой посредник (независимо от того, использует ли он кэш) не должен преобразовывать содержимое ответа.
Примечание. Одним из таких посредников является Google Web Light. Он преобразует изображения, чтобы свести к минимуму объем данных для хранения в кеше или медленного соединения, и поддерживает отказ от преобразования без преобразования.
неизменяемый
Директива immutable response указывает, что ответ не будет обновляться, пока он свежий.
Современная передовая практика для статических ресурсов заключается в том, чтобы включать версии/хэши в их URL-адреса, никогда не изменяя ресурсы, а вместо этого, при необходимости, обновляя ресурсы с более новыми версиями, которые имеют новую версию- числа/хэши, чтобы их URL-адреса были разными. Это называется шаблоном очистки кеша.
Когда пользователь перезагружает браузер, браузер отправляет условные запросы для проверки на исходный сервер. Но нет необходимости повторно проверять такие статические ресурсы, даже когда пользователь перезагружает браузер, потому что они никогда не изменяются. immutable сообщает кэшу, что ответ остается неизменным, пока он свежий, и позволяет избежать подобных ненужных условных запросов к серверу.
Когда вы используете шаблон очистки кеша для ресурсов и применяете их к длинному max-age , вы также можете добавить неизменяемость, чтобы избежать повторной проверки.
устарело во время повторной проверки
Директива ответа stale-while-revalidate указывает, что кеш может повторно использовать устаревший ответ во время его повторной проверки в кеше.
В приведенном выше примере ответ актуален в течение 7 дней (604 800 с). Через 7 дней он устаревает, но кеш может повторно использовать его для любых запросов, сделанных в течение следующего дня (86 400 с), при условии, что они повторно проверяют ответ в фоновом режиме.
Повторная проверка сделает кеш снова свежим, поэтому клиентам будет казаться, что он всегда был свежим в течение этого периода, что эффективно скрывает от них штраф за задержку повторной проверки.
Если в течение этого периода запросов не было, кэш устареет, и следующий запрос будет повторно проверен в обычном режиме.
устарело-если-ошибка
Директива ответа stale-if-error указывает, что кеш может повторно использовать устаревший ответ, когда исходный сервер отвечает с ошибкой (500, 502, 503 или 504).
В приведенном выше примере ответ актуален в течение 7 дней (604 800 с). Через 7 дней он устаревает, но его можно использовать еще 1 день (86 400 с), если сервер выдает ошибку.
По прошествии некоторого времени сохраненный ответ обычно устаревает. Это означает, что клиент получит ответ об ошибке как есть, если его отправит исходный сервер.
Запрос директив
без кеша
Директива no-cache request просит кэши проверить ответ на исходном сервере перед повторным использованием.
без кеша позволяет клиентам запрашивать самый последний ответ, даже если в кеше есть свежий ответ.
Браузеры обычно добавляют отсутствие кеша к запросам, когда пользователи принудительно перезагружают страницу.
нет магазина
Директива no-store request позволяет клиенту потребовать, чтобы кеш воздержался от сохранения запроса и соответствующего ответа, даже если ответ исходного сервера может быть сохранен.
Обратите внимание, что основные браузеры не поддерживают запросы без сохранения .
максимальный возраст
Директива запроса max-age=N указывает, что клиент разрешает сохраненный ответ, который генерируется на исходном сервере в течение N секунд, где N может быть любым не -отрицательное целое число (включая 0 ).
В приведенном выше случае, если ответ с Cache-Control: max-age=604800 был сгенерирован более 3 часов назад (рассчитано на основе max-age и заголовка Age), кеш не сможет повторно использовать этот ответ.< /p>
Многие браузеры используют эту директиву для перезагрузки, как описано ниже.
max-age=0 — это обходной путь для no-cache , поскольку многие старые (HTTP/1.0) реализации кэша не поддерживают no-cache . В последнее время браузеры по-прежнему используют max-age=0 при «перезагрузке» — для обратной совместимости — и альтернативно используют no-cache для «принудительной перезагрузки».
Кэшам рекомендуется рассматривать ответы, содержащие неверную информацию о свежести, как устаревшие.
Другими словами, для любого значения max-age, которое не является целым числом или не является неотрицательным, при кэшировании рекомендуется обрабатывать значение так, как если бы оно было равно 0 .
максимальное количество устаревших
Директива запроса max-stale=N указывает, что клиент разрешает сохраненный ответ, который устаревает в течение N секунд.
В приведенном выше случае, если ответ с Cache-Control: max-age=604800 был сгенерирован более 3 часов назад (рассчитано на основе max-age и заголовка Age), кеш не сможет повторно использовать этот ответ.< /p>
Клиенты могут использовать этот заголовок, когда исходный сервер не работает или работает слишком медленно, и могут принимать кешированные ответы из кешей, даже если они немного устарели.
Обратите внимание, что основные браузеры не поддерживают запросы с max-stale .
мин-фреш
Директива запроса min-fresh=N указывает, что клиент разрешает сохраненный ответ, который является свежим в течение как минимум N секунд.
В приведенном выше случае, если ответ с Cache-Control: max-age=3600 был сохранен в кеше 51 минуту назад, кеш не мог повторно использовать этот ответ.
Клиенты могут использовать этот заголовок, когда пользователю требуется, чтобы ответ был не только свежим, но и не обновлялся в течение определенного периода времени.
Обратите внимание, что основные браузеры не поддерживают запросы с min-fresh .
без преобразования
То же значение, что и у no-transform для ответа, но вместо этого для запроса.
только при кэшировании
Клиент указывает, что кэш должен получить уже кэшированный ответ. Если кеш сохранил ответ, он используется повторно.
Случаи использования
Предотвращение хранения
Если вы не хотите, чтобы ответ сохранялся в кеше, используйте директиву no-store.
Обратите внимание, что отсутствие кеша означает, что "его можно сохранить, но не использовать повторно перед проверкой", то есть это не предотвращает сохранение ответа.
Теоретически, если директивы противоречат друг другу, должна соблюдаться самая ограничительная директива. Таким образом, приведенный ниже пример в основном бессмысленен, поскольку private , no-cache , max-age=0 и must-revalidate конфликтуют с no-store .
Кэширование статических ресурсов с помощью "очистки кеша"
При создании статических ресурсов с механизмами управления версиями/хэширования добавление версии/хэша к имени файла или строке запроса является хорошим способом управления кэшированием.
Версия библиотеки React изменится при обновлении библиотеки, и hero.jpg также изменится при редактировании изображения. Так что их трудно хранить в кеше с max-age .
В таком случае вы можете удовлетворить потребности в кэшировании, используя конкретную пронумерованную версию библиотеки и включив хэш изображения в его URL-адрес.
Вы можете добавить длинное значение max-age и неизменяемое, потому что содержимое никогда не изменится.
Когда вы обновляете библиотеку или редактируете изображение, новый контент должен иметь новый URL, а кэши не используются повторно.Это называется шаблоном "очистка кеша".
Используйте без кэширования, чтобы убедиться, что сам HTML-ответ не кэшируется. no-cache может привести к повторной проверке, и клиент правильно получит новую версию HTML-ответа и статических ресурсов.
Примечание. Если index.html находится под управлением базовой аутентификации или дайджест-аутентификации, файлы в каталоге /assets не сохраняются в общем кэше. Если файлы /assets/ подходят для хранения в общем кэше, вам также потребуется один из следующих вариантов: public , s-maxage или must-revalidate .
Всегда актуальная информация
Для содержимого, которое генерируется динамически или является статичным, но часто обновляется, вы хотите, чтобы пользователь всегда получал самую последнюю версию.
Если вы не добавите заголовок Cache-Control, потому что ответ не предназначен для кэширования, это может привести к непредвиденному результату. Кэш-хранилищу разрешено кэшировать его эвристически — поэтому, если у вас есть какие-либо требования к кэшированию, вы всегда должны указывать их явно, в заголовке Cache-Control.
Добавление к ответу отсутствия кеша вызывает повторную проверку на сервере, поэтому вы можете каждый раз отправлять новый ответ — или, если у клиента уже есть новый, просто ответить 304 Not Modified .
Но сейчас вы можете просто использовать без кэширования.
Очистка уже сохраненного кеша
К сожалению, нет директив кэша для очистки уже сохраненных ответов из кэша.
Представьте, что клиенты/кэши хранят свежий ответ для пути без передачи запросов на сервер. Сервер ничего не может сделать с этим путем.
Кроме того, Clear-Site-Data может очищать кеш браузера для сайта. Но будьте осторожны: при этом удаляются все сохраненные ответы для сайта — и только в браузерах, а не в общем кеше.
Очищает кэш одного или нескольких индексов. Для потоков данных API очищает кеши индексов поддержки потока.
Запросить редактирование
Предварительные требования
- Если функции безопасности Elasticsearch включены, у вас должны быть права на управление индексом для целевого потока данных, индекса или псевдонима.
Изменить параметры пути
(Необязательно, строка) Разделенный запятыми список потоков данных, индексов и псевдонимов, используемых для ограничения запроса. Поддерживает подстановочные знаки ( * ). Чтобы настроить таргетинг на все потоки данных и индексы, опустите этот параметр или используйте * или _all .
Изменить параметры запроса
(Необязательно, логическое значение) Если задано значение false , запрос возвращает ошибку, если какое-либо выражение с подстановочными знаками, псевдоним индекса или значение _all нацелены только на отсутствующие или закрытые индексы. Это поведение применяется, даже если запрос нацелен на другие открытые индексы. Например, запрос, нацеленный на foo*,bar*, возвращает ошибку, если индекс начинается с foo, но ни один индекс не начинается с bar .
По умолчанию true .
all Соответствует любому потоку данных или индексу, включая скрытые. open Соответствует открытым, не скрытым индексам. Также соответствует любому нескрытому потоку данных. закрытые Соответствуют закрытым, не скрытым индексам. Также соответствует любому нескрытому потоку данных. Потоки данных не могут быть закрыты. hidden Сопоставьте скрытые потоки данных и скрытые индексы. Должен сочетаться с open , Closed или с обоими. шаблоны подстановочных знаков не принимаются.
По умолчанию открывается .
(Необязательно, логическое значение) Если задано значение true , кэш полей очищается.
Используйте параметр fields, чтобы очистить кэш только от определенных полей.
(Необязательно, строка) Список имен полей, разделенных запятыми, используемый для ограничения параметра fielddata.
По умолчанию для всех полей.
Этот параметр не поддерживает объекты или псевдонимы полей.
index (Необязательный, строка) Разделенный запятыми список имен индексов, используемых для ограничения запроса. ignore_unavailable (необязательно, логическое значение) Если задано значение false , запрос возвращает ошибку, если он нацелен на отсутствующий или закрытый индекс. По умолчанию false. query (Необязательный, логический) Если true , очищает кеш запросов. request (Необязательный, логическое значение) Если true , очищает кеш запросов.
Если вы веб-разработчик, вы, как и я, вероятно, достигли того момента в своей карьере, когда вы случайно отправили некачественный выпуск интерфейсного ресурса. И вы дали ему срок жизни кэша 30 лет. Плохие новости. Ваши пользователи облажались, пока они вручную не очистят свой кеш. Или они?
Оказывается, есть много способов решить эту проблему без необходимости устанавливать короткий TTL для вашего объекта. Дополнительным преимуществом является то, что это также дает вам возможность планировать быстрое обновление ваших активов, даже если у вас нет плохого выпуска или проблемы. Во всех этих решениях я предполагаю, что вы знаете URL-адрес актива, который хотите очистить, и что ваше приложение по-прежнему делает какой-то запрос на ваш сервер для чего-то, во что мы можем встроить исполняемый JavaScript, поэтому либо скрипт или HTML-страница.
location.reload(true)
Ваше первое решение было предложено Стивом Содерсом и Стояном Стефановым в 2012 году. В нем используется тот факт, что метод reload() объекта местоположения принимает логический параметр принудительной перезагрузки, который отмечает MDN:
Это логический флаг, который, если он равен true, приводит к тому, что страница всегда перезагружается с сервера.
Будет ли он загружать все ресурсы страницы с сервера независимо от того, находятся ли они в данный момент в кеше или только верхний документ?
Поскольку вы не хотите мешать тому, что делает пользователь, явно перезагружая документ верхнего уровня, вам следует использовать для этого iframe. В фрагменте скрипта в документе верхнего уровня вы можете сделать это:
Затем в ответе /forcereload:
Чтобы это работало, вам нужно создать iframe, загрузить HTML-документ, не связанный с тем, что мы хотим аннулировать, а затем снова загрузить его, а также дважды загрузить объект, который нужно аннулировать (хотя первый из них будет из кеша). Это очень плохо. Вдобавок ко всему этому у вас остается iframe, прикрепленный к документу, который вы хотите как-то очистить, возможно, с почтовым сообщением от фрейма до родителя, чтобы сообщить ему, что теперь он может удалить фрейм. И, как указывает Филип Теллис, древняя, но не обновляющаяся автоматически версия Firefox войдет в бесконечный цикл перезагрузки.
Оказывается, это даже не так, как вы могли подумать. Аргумент принудительной перезагрузки, задокументированный MDN, технически не является частью спецификации интерфейса определения местоположения, и браузер не меняется, когда выполняет сетевую выборку (по крайней мере, в отношении подресурсов) на основе значения этого аргумента. Однако браузеры демонстрируют различное поведение для самой функции reload(). Chrome всегда загружает подресурс из кеша. Firefox, Edge и Safari всегда загружают его из сети.
Похоже, единственный эффект от аргумента forceReload заключается в следующем:
- Что касается самого документа (iframe «reloader» в нашем методе), forceReload предлагает загрузить его по сети в Firefox, если в противном случае он был бы извлечен из кеша. Все остальные браузеры всегда перезагружают документ из сети.
- Что касается подресурсов (например, скрипта, который мы пытаемся обновить), если браузер отправляет сетевой запрос на перезагрузку (все, кроме Chrome), то установка принудительной перезагрузки предотвратит выполнение условных запросов. производится, если какой-либо из перезагружаемых ресурсов имеет заголовки ETag или Last-Modified. В Chrome принудительная перезагрузка не влияет на это — в любом случае из сети не выполняется выборка.
Еще один недостаток этого метода заключается в том, что практически невозможно предотвратить добавление ложных записей в историю браузера.
Это решение использует Стив Содерс, и тестовый пример, который он создал для него в 2012 году, сегодня не работает в Chrome, что подтверждает то, что я обнаружил в ходе тестирования. Кажется, мы можем объяснить это изменением поведения Chrome. Поскольку этого аргумента нет в спецификации, технически это не ошибка, но я могу предположить, что у людей могут быть реализации этой техники в дикой природе, и жаль, что она больше не работает.
Изменение + получение
Давайте перейдем к потенциально лучшему варианту. Я немного одержим заголовком Vary, и я думаю, что мы можем использовать его здесь. Его реализуют все браузеры, и они используют его как валидатор, а не как ключ кэша, а это означает, что при изменении значения заголовка существующий кэшированный объект будет недействителен для нового запроса, а любой новый загруженный объект заменит объект, уже находящийся в кеше (это поведение отличается от CDN и других «общих» кешей, которые будут хранить несколько вариантов одного и того же URL-адреса).
Итак, давайте установим заголовок Vary для всех ответов с сервера, изменяя что-то несуществующее:
Это не будет иметь никакого эффекта, поскольку браузеры не отправляют заголовок Forced-Revalidate. Но выборка может:
Итак, что здесь происходит?
- Вы делаете запрос к /thing/stuck/in/cache , и он находит совпадение в кеше, но кешированный объект изменяется с помощью Forced-Revalidate с ключом «» (пустая строка). Новый запрос имеет значение Forced-Revalidate, равное 1, поэтому он не совпадает. Вы также включаете в запрос учетные данные, чтобы гарантировать, что ответ можно использовать для обычного запроса навигации.
- Запрос отправляется в сеть. Сервер возвращает новую версию файла и по-прежнему включает в себя Vary: Forced-Revalidate
- Браузер перезаписывает существующий элемент кеша новым, который теперь действителен только для запросов с заголовком Forced-Revalidate: 1 .
Но подождите. Теперь элемент в кеше будет соответствовать только будущим запросам с заголовком Forced-Revalidate. В следующий раз, когда у браузера будет обычная причина для загрузки этого файла, в качестве навигации или подресурса, он не отправит специальный заголовок, и вы снова пропустите кэш. Однако на этот раз загруженный ответ будет иметь ключ изменения "" (пустая строка) и снова станет полезным.
Конечно, в идеале было бы что-то, что вы могли бы поместить вместо заголовков: < «Forced-Revalidate»: 1 >чтобы просто сказать fetch, чтобы пропустить кеш напрямую.
выборка + кеш: перезагрузка
Что приводит меня к свойству кэша объекта запроса Fetch API. Это самый простой и идеальный способ решить проблему:
Режим кеша «перезагрузка» указывает выборке игнорировать кеш и обращаться напрямую к сети, но сохранять любой новый ответ в кеше. Как и раньше, вы включаете учетные данные, чтобы выборка (предположительно) обрабатывалась так же, как обычная навигация для целей кэширования. Новый ответ сразу же можно использовать для любых будущих запросов, и вам не нужны какие-то сумасшедшие заголовки, iframe или что-то еще.
Звучит идеально! Ну, прямо сейчас это работает в Edge, Firefox и Safari, и Chrome почти готов (он отлично работает в Canary, но еще не стал стабильным). На самом деле поддержка этого для ресурсов того же происхождения намного лучше, чем я ожидал, а таблица поддержки MDN устарела, поэтому, вероятно, она появилась в Safari и Edge совсем недавно.
И еще. В Safari это очистит только кеш выборки, и хотя навигация может заполнить кеш выборки, обратное неверно. Кроме того, Edge — единственный браузер, поддерживающий этот междоменный доступ.
выборка + POST
Пришло время выпустить более крупное оружие. Запросы POST делают недействительным кэшированное содержимое для этого URL:
Кэш ДОЛЖЕН сделать недействительным действующий URI запроса (раздел 5.5 [RFC7230]), а также URI в полях заголовка ответа Location и Content-Location (если они есть), когда статус отсутствия ошибки код получен в ответ на небезопасный метод запроса.
Вопрос в том, учитывают ли это браузеры и кэшируют ли они ответ? Давайте посмотрим, используя fetch для создания программного запроса POST для застрявшего URL:
Вам придется смириться с предварительным запросом, потому что это небезопасный метод, и вы включаете учетные данные. Также оказывается, что ни один браузер не кэширует результат POST, даже если он рекламирует себя как кэшируемый (или, если они это делают, они не используют его для выполнения последующего GET). Таким образом, даже если вы увидите аннулирование, для повторного заполнения кеша потребуется как минимум 3 запроса.
С этой оговоркой Chrome и Edge преуспевают здесь, поскольку их единое представление кеша делает недействительным как одно и то же, так и содержимое из разных источников, как для выборки, так и для навигации. Firefox и Safari следуют той же схеме, которую мы видели раньше, разделяя навигацию и выборку в отдельные кэши, поэтому POST очищает кеш выборки, но если ваш зависший объект является подресурсом, вам не повезло.
POST в iframe
Ну ладно, за копейки, за фунт, так что давайте добавим ФОРМУ в IFRAME и выполним там POST. Я знаю, мне жаль. Отчаянные времена.
Есть несколько очевидных побочных эффектов: это создаст запись в истории браузера и подвержено тем же проблемам некэширования ответа. Но он не соответствует требованиям предварительной проверки, которые существуют для выборки, и, поскольку это навигация, браузеры, разделяющие кеш, будут очищать правильный.
В этом почти все получилось. Firefox будет удерживать застрявший объект для ресурсов из разных источников, но только для последующих выборок. Каждый браузер сделает недействительным кеш навигации для объекта, как для одного, так и для ресурсов из разных источников.
Очистить данные сайта
Мы начали с уродства, нашли совершенство, а затем обнаружили, что совершенство — это не то, чем его выдумывали, и снова стали уродливыми. Так что кажется уместным закончить эту историю вариантом, который можно было бы озаглавить «взорвать его с орбиты».
Познакомьтесь с Clear-Site-Data, новым оружием массового поражения веб-разработчиков.
Независимо от того, какой URL вы хотите очистить, вы можете просто вернуть этот заголовок ответа в ответ на ЛЮБОЙ запрос в целевом источнике:
И бац, ваш кеш пропал. И не только то, что вы хотели очистить. Весь кеш для вашего источника тост. Что может просто спасти вас в крайнем случае.
Еще одно преимущество этого метода заключается в том, что вам не нужно иметь возможность запускать какой-либо клиентский JavaScript, поэтому вы даже можете отправить его в ответ на запрос изображения или таблицы стилей. Он великолепен отсутствием изощренности и жестокой эффективностью.
Обсуждение этой функции началось несколько лет назад, но она только сейчас начинает появляться в Chrome, хотя на момент написания статьи она была временно отключена по… причинам. Так что сейчас он не работает ни в одном браузере. Бу.
Заключение
Итак, в каких ситуациях браузеры делают сетевые запросы, которые делают недействительным кеш, используемый подресурсами?
Техника | Firefox | Safari | Edge | Chrome | |
местоположение.reload | doc, forceReload, тот же источник | Да | Да | Да | Да |
документ, обычный, того же происхождения | Нет | Да | Да | Да | |
doc, forceReload, кросс-происхождение | Да | Да | Да | < td >Да||
doc, обычный, кросс-происхождение | Нет | Да | Да td> | Да | |
resource, forceReload, тот же источник | Да | Да | Да | Нет | |
ресурс, нормальный, того же происхождения | Варьируется [1] | Да< /td> | Да | Нет | |
ресурс, принудительная перезагрузка, перекрестное происхождение | Да | Да | Да | Нет | |
ресурс, обычный, кросс-происхождение | Варьируется [1] | Да | Да | Нет | |
Варьировать + выборка | того же происхождения | Да | Да [3] | Да | Да | крест-о происхождение | Нет [2] | Да [3] | Да | Да |
cache:reload | тот же источник | Да | Нет [4] | Да td> | Да [5] |
независимое происхождение | Нет [2] | Нет [4] td> | Да | Да [5] | |
Fetch + POST | того же происхождения< /td> | Да | Нет [4] | Да | Да |
кросс- происхождение | Нет [2] | Нет [4] | Да | Да | |
Iframe + POST | тот же источник | Да | Да | Да | < td >Да|
независимое происхождение | Да [6] | Да | Да | Да | |
Очистить данные сайта | Нет | Нет | Нет td> | Нет |
[1] Попадание в сеть, если ресурс не имеет Cache-Control: неизменяемый
[2] Разделяет кэши выборки/навигации для внешних источников, поэтому не очищает кэш навигации
[3] Выборка делает недействительной как кеш навигации, так и кеш выборки, но последующая выборка не будет повторно заполнять кеш навигации.
[4] Не очищает кеш навигации, только кеш выборки
[5] Сегодня поддерживается в Chrome Canary
[6] Не очищает кеш выборки
Итак, в заключение, если вы хотите аннулировать скрипт или другой подресурс, используйте метод Iframe + POST, который работает во всех браузерах как для одного источника, так и для разных источников.
«Правильный» способ — это cache:reload , поэтому мы надеемся, что Safari и Firefox изменят свое поведение в будущем, чтобы сделать этот метод более полезным на практике.
Тысячи компаний по всему миру экономят время и деньги с Okta. Узнайте, какое влияние идентификационные данные могут оказать на вашу организацию.
Кэшированные данные – это информация, сохраняемая на вашем компьютере или устройстве после посещения вами веб-сайта. Разработчики используют кешированные данные, чтобы улучшить вашу работу в Интернете.
Большинство потребителей ожидают, что веб-сайт загрузится в течение двух-трех секунд. Еще немного, и они могли бы перейти к конкуренту. Они могут больше никогда не вернуться на ваш сайт.
Цель кэширования данных – ускорить загрузку сайта. Вашему устройству не придется долго болтать с сервером, чтобы загрузить весь текст, изображения и формы на сайте. Некоторые из этих битов и байтов будут храниться на вашем устройстве.
Но у некоторых из этих сохраненных данных есть и темная сторона. Хакеры могут использовать его для запуска атаки, которая может поставить под угрозу вашу безопасность.
Как работают кэшированные данные?
Подумайте о кеше как о хранилище данных веб-сайта, которые вы постоянно используете. Каждый раз, когда вы посещаете этот веб-сайт, ваше устройство должно получать эту информацию. Если он хранится в кеше, ваше устройство пропускает шаг, и вы экономите драгоценное время.
Вы не можете выбирать, что помещается в кеш. Разработчики делают эту работу за вас, основываясь на том, что, по их мнению, обеспечивает самое быстрое время загрузки и лучший опыт.
Если вы живете в районе с нестабильным доступом в Интернет, кешированные данные могут быть спасением. Вы можете ждать и ждать, пока загрузится весь сайт. Если некоторые из них кэшируются, вы можете очень быстро получить нужные биты.
Кэш-память — не единственная форма памяти, которую использует ваш компьютер. На самом деле разработчики используют так называемую иерархию компьютерной памяти, чтобы описать, как большинство устройств хранят данные и получают к ним доступ.
Кэшированные данные отличаются от других форм, поскольку пользователи могут удалить их, выполнив несколько простых действий.
Что даст очистка кэшированных данных?
Большинство устройств имеют ту или иную форму очистки кэша. Поступают новые данные, а старая информация удаляется. Эта система гарантирует, что на вашем устройстве не будет так много места для хранения, что оно не сможет справиться с чем-то новым.
Но вы также можете очистить кеш.Общие причины для этого включают:
- Скорость и производительность. Полному кешу нужна память, а если вы заполнены, перегруженная память не работает очень быстро. Удаление невыполненной работы может ускорить работу вашего устройства.
- Очистка от взлома. После атаки разработчики могут восстановить работоспособность сайта. Если на вашем устройстве есть кешированная версия неработающего сайта, ее повторный запуск может по-прежнему означать запуск атаки. Подобный скомпрометированный кеш сайта может быть очень опасным.
- Защита конфиденциальности. Кто-то, войдя на ваше устройство, может увидеть, куда вы пошли и что вы сделали, просматривая ваши кешированные данные. Если вы используете общедоступное устройство, например компьютер в библиотеке, ваш кеш может стать воротами для атаки.
Некоторые пользователи просто никогда не очищают кэшированные данные. Но поскольку эти риски реальны, стоит добавить очистку к своим регулярным задачам обслуживания.
Как очистить кэшированные данные
Веб-сайты хранят информацию на любом устройстве, имеющем доступ в Интернет, включая компьютеры и мобильные устройства. Мы рассмотрим несколько примеров, чтобы помочь вам понять, как навести порядок.
Очистите кеш в распространенных веб-браузерах, таких как:
- Google Chrome. Коснитесь трех точек в правом верхнем углу экрана. Откройте «Настройки», затем «Дополнительно», затем «Конфиденциальность и безопасность» и «Очистить данные браузера». Удалите кэшированные изображения и файлы, установив соответствующий флажок.
- Интернет-обозреватель. Коснитесь значка шестеренки и прокрутите до «Свойства обозревателя». Установите флажок "Удалить историю просмотров".
- Сафари. Откройте меню "История" и нажмите "Очистить историю".
- Файрфокс. Коснитесь трех горизонтальных полос в углу и выберите «Параметры», затем «Конфиденциальность и безопасность». Установите флажок "История просмотров и загрузок".
Может быть немного сложно понять, как очистить кеш на мобильном устройстве. Ваш тип и версия программного обеспечения определяют, как вы будете решать эту задачу. Но в большинстве случаев вы будете следовать одному из двух типов указаний в зависимости от производителя вашего устройства. Если вы используете:
-
, перейдите в «Настройки» и выберите веб-браузер. Затем нажмите «Очистить историю и данные веб-сайта». , перейдите в «Настройки», а затем в «Хранилище». Выберите приложение веб-браузера, а затем нажмите «Очистить кэш».
Вы не запретите компьютеру или устройству сохранять больше данных каждый раз, когда вы посещаете другой сайт. Процесс продолжается. Но как только вы привыкнете к шагам, вам будет легко выполнять их по установленному вами расписанию.
Помощь Окты
Что еще нужно сделать, чтобы защитить свой компьютер и устройства от хакеров? Позвольте нам помочь.
В Okta мы специализируемся на защите данных больших и малых компаний. Мы будем рады помочь вам. Свяжитесь с нами, чтобы узнать больше.
Читайте также:
- Как изменить электронную почту на госуслугах с компьютера
- С помощью каких компьютерных математических моделей можно реализовать
- Как зарегистрироваться в roblox на ПК
- Какие критерии нельзя использовать для поиска файла на ПК
- Файл этой версии не может содержать формулы, которые относятся к ячейкам вне области действия