Как долго браузеры кэшируют HTTP 301?

Я отлаживаю проблему с постоянным перенаправлением HTTP 301. После быстрого теста кажется, что Safari очищает свой кеш из 301-х, когда он перезагружается, но Firefox не делает.

Когда IE, Chrome, Firefox и Safari очищают свой кеш из 301-х?

UPDATE: Например, если я хочу перенаправить example1.com в example2.com, но я случайно установил его для перенаправления на example3.com, это проблема. Я могу исправить ошибку, но любой, кто посетил example1.com, тем временем кэшировал неверный переадресацию на example3.com, и поэтому они не смогут достичь либо example1.com, либо example2.com, пока их кеш не будет очищен, При исследовании я обнаружил, что не было наборов заголовков Cache-Control и Expires. Заголовки для неправильного ответа 301 были бы такими:

HTTP/1.1 301 Moved Permanently
Date: Wed, 27 Feb 2013 12:05:53 GMT
Server: Apache/2.2.21 (Unix) DAV/2 PHP/5.3.8
X-Powered-By: PHP/5.3.8
Location: http://example3.com/
Content-Type: text/html

Мои собственные тесты показывают, что:

  • IE7, IE8, Android 2.3.4 вообще не кэшируются.
  • Firefox 18.0.2, Safari 5.1.7 (в Windows 7) и Opera 12.14 весь кеш и очистите кеш при перезагрузке браузера.
  • кеш-память IE10 и Chrome 25, но не очистка от перезапуска браузера, , и когда они очистятся?
+309
03 февр. '12 в 14:42
источник поделиться
13 ответов

Как минимум два браузера - Chrome и Firefox - будут кэшировать 301 переадресацию без даты истечения срока действия.

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

Вы можете проверить это, по крайней мере, в Firefox, перейдя в about:cache и найдя его в кеше диска.

Я не знаю о поведении других браузеров, таких как IE10/IE11. Однако, учитывая, что другие браузеры кэшируют его на неопределенный срок, вам все равно придется приспособиться к этому.

Во всех браузерах, включая Chrome/Firefox, по-прежнему можно переопределить это поведение по умолчанию с помощью заголовков, как описано ниже:

Примечание: этот ответ был написан в 2014 году, и поведение браузера может меняться со временем.

Если вы не хотите, чтобы перенаправление было кэшировано

Это неопределенное кэширование - это кеширование по умолчанию этими браузерами при отсутствии заголовков Cache-Control. Логика заключается в том, что вы указываете "постоянную" перенаправление и не даете им никаких других инструкций кэширования, поэтому они будут обрабатывать ее так, как если бы вы хотели ее кешировать на неопределенный срок.

Браузеры по-прежнему считают заголовки Cache-Control и Expires похожими на любой другой ответ, если они указаны.

Вы можете добавить заголовки, такие как Cache-Control: max-age=3600 или Expires: Thu, 01 Dec 2014 16:00:00 GMT, в свои 301 переадресацию. Вы даже можете добавить Cache-Control: no-cache, чтобы он не был постоянно кэширован браузером или Cache-Control: no-store, поэтому браузер не может быть сохранен в временном хранилище браузером.

Лучшей альтернативой, на мой взгляд, является использование перенаправления 302 или 307. Это не означает, что браузеры или кэши являются "перманентными" перенаправлениями и поэтому не должны кэшироваться в отсутствие заголовков Cache-Control.

Мне кажется, что выпуск 301-редиректа, но отмечающий его как не кэшируемое, противоречит духу того, для чего нужен 301-редирект, хотя это может быть технически обоснованным. YMMV, и вы можете найти краевые случаи, когда имеет смысл для "постоянного" перенаправления иметь ограничение по времени.

Если вы ранее отправили 301 переадресацию, но хотите отказаться от этого

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

  • Самое простое и лучшее решение - выпустить еще 301 перенаправление обратно.

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

    Изменить: некоторые комментарии ставят под сомнение это, см. ниже.

  • Если у вас нет контроля над сайтом, на котором была предыдущая цель перенаправления, тогда вам удача. Попробуйте попросить владельца сайта перенаправить обратно к вам.

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

+267
28 янв. '14 в 3:59
источник

Связанные вопросы


Похожие вопросы

Чтобы очистить постоянное перенаправление, перейдите в chrome://net-internals. Справа от верхней красной строки состояния нажмите стрелку вниз ▼, чтобы открыть раскрывающееся меню, и в группе "Инструменты" выберите "Очистить кэш".

Начиная с версии 48, это было единственное, что помогло мне очистить кэшированный 301.

Обновление: К сожалению, с версии 71 (декабрь 2018 г.) Google удалила функцию net-internals.

+229
29 янв. '16 в 20:36
источник

Ответ, который помогает тем, кто отчаянно хочет избавиться от кеша перенаправления:

Chrome кэширует редирект 301 бесконечно (в локальном дисковом кеше). Чтобы очистить этот кеш:

  • откройте свой DevTools (нажмите F12)
  • на вкладке Сеть установите флажок "Отключить кэш"
  • оставьте DevTools открытым и перезагрузите страницу (нажмите F5)

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

+87
27 нояб. '14 в 16:46
источник

Сделайте, чтобы пользователь отправил почтовую форму на этот URL-адрес, и кешированная переадресация исчезла:)

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>
+27
13 мая '17 в 6:39
источник

301 - это кешируемый ответ на HTTP RFC, и браузеры будут кэшировать его в зависимости от заголовков кеширования HTTP, которые у вас есть на ответ. Используйте FireBug или Charles, чтобы изучить заголовки ответов, чтобы узнать точную продолжительность ответа на кеширование.

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

Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
+22
23 февр. '12 в 14:30
источник

Подтверждено !! Сделайте так, чтобы пользователь отправил почтовый запрос на затронутый URL, и кэшированное перенаправление было забыто

Быстрый выигрыш - ввести это в консоль браузера, если вы можете:

fetch('example.com/affected/link', {method: 'post'}).then(() => {})

Полезно, если вы знаете уязвимый браузер (особенно во время разработки).

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

+8
26 дек. '18 в 23:43
источник

Существует очень простой способ удаления кэша браузера для http-перенаправлений, например, 301, 307 и т.д.

Вы можете открыть сетевую панель в консоли разработчика в Chrome. Выберите сетевой вызов. Щелкните правой кнопкой мыши на нем, а затем нажмите Очистить кэш браузера, чтобы удалить кэшированное перенаправление.

network call context menu

+8
25 мар. '19 в 11:21
источник

В целях тестирования (чтобы избежать кэшированных перенаправлений), люди могут открыть НОВОЕ ЧАСТНОЕ ОКНО: нажмите CTRL+SHIFT+ N [если вы используете Mozilla, используйте P ]

+7
29 дек. '15 в 18:46
источник

У меня есть простое решение, которое работает на всех основных браузерах (последняя версия), включает в себя IE, Chrome и FF

  1. Ctrl + Shift + Del
  2. -
    1. Chrome: выберите "История просмотров" и "Кэш..."
    2. IE: я оставляю опцию по умолчанию "Временные файлы Интернета и файлы сайта", "Файлы cookie и данные сайта", "История"
    3. FF: "История просмотра и загрузки", "Кэш"
  3. Нажмите "Удалить"
  4. Закройте и снова откройте ваш браузер. Он должен работать
+6
03 дек. '14 в 3:39
источник

как ответ @thomasrutter

Если вы ранее отправили 301 переадресацию, но хотите отказаться от этого

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

Самое простое и лучшее решение - снова отправить еще один 301 редирект.

     

Браузер поймет, что он обращается к тому, что ранее считалось выведенным из эксплуатации URL, и это должно привести к повторному извлечению этого URL-адреса, чтобы подтвердить, что старое перенаправление еще не существует.

     

Если у вас нет контроля над сайтом, на котором была предыдущая цель перенаправления, тогда вам удача. Попробуйте попросить владельца сайта перенаправить обратно к вам.

Фактически это означает:

  • a.com 301 to b.com

  • удалить a.com 301

  • добавить b.com 301 на сайт

Затем он работает.

+5
31 мар. '16 в 5:33
источник

Как показывают другие ответы. Кеширование может быть неопределенным в браузере. Это чрезвычайно опасно. Так что не делай этого. По крайней мере, добавьте заголовки кэша. В htaccess я всегда так делаю, теперь кеширую вообще:

<IfModule mod_rewrite.c>
  RewriteCond %{HTTP_HOST} ^(www\.)?example\.com$ [NC]
  # The E=nocache:1 sets the environment variable nocache to the value of one
  RewriteRule ^/?(.*) https://www.example.org/$1 [L,R=301,E=nocache:1]
</IfModule>


<IfModule mod_headers.c>
  ## Set the response header if the "nocache" environment variable is set
  ## in the RewriteRule above.
  Header always set Cache-Control "no-store, no-cache, must-revalidate" env=nocache

  ## Set Expires too ...
  Header always set Expires "Thu, 01 Jan 1970 00:00:00 GMT" env=nocache
</IfModule>
+1
19 нояб. '18 в 9:22
источник

Проверьте свои переадресации с помощью режима инкогнито /InPrivate, поэтому, когда вы закроете браузер, он будет скрывать этот кеш, а повторное открытие окна не будет содержать кеш.

+1
22 мар. '18 в 22:29
источник

Чтобы решить проблему с адресом localhost, я изменил номер порта, под которым работал сайт. Это работало на Chrome версии 73.0.3683.86.

+1
26 мар. '19 в 17:46
источник

Посмотрите другие вопросы по меткам или Задайте вопрос