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

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

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

ОБНОВЛЕНИЕ: например, если я хочу перенаправить 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 кешируются, но не очищаются при перезапуске браузера, так когда они будут очищаться?

19 ответов

По крайней мере, два браузера - 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-адрес.

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

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

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

Chrome кэширует редирект 301 бесконечно, или пока вы не откроете DevTools, отметьте Отключить кеш (пока открыт DevTools) и перезагрузите страницу.

Это работало для меня в Chrome 39, но, к сожалению, не для localhost.

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

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

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

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>

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

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

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

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

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

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

Я отправлю ответ, который мне помог:

перейти по URL:

chrome://settings/clearBrowserData

он должен вызвать всплывающее окно, а затем..

  • выбрать только: cached images and files.
  • выберите временной интервал: from beginning

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

Как ответ @thomasrutter

Если вы ранее произвели перенаправление 301, но хотите отменить это

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

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

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

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

На самом деле это означает:

  1. от 301 до b.com

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

  3. добавить b.com 301 на a.com

Тогда это работает.

В последней версии Google Chrome 79 вы можете использовать http://chrome//net-internals и выбрать DNS на левой панели, а затем нажать кнопку Очистить кеш хоста.

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

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

Как показывают другие ответы. Кеширование может быть неопределенным в браузере. Это чрезвычайно опасно. Так что не делай этого. По крайней мере, добавьте заголовки кэша. В 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>

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

Протестируйте свои перенаправления в режиме инкогнито /InPrivate, чтобы при закрытии браузера он очищал этот кэш, и повторное открытие окна не содержало кеш.

попробуйте это в своем файле .htaccess:

        <IfModule mod_expires.c>
  ExpiresActive On
  Header set Cache-Control "no-store, no-cache, must-revalidate, max-age=0"
  Header Set Cache-Control "max-age=0, no-store"
  Header Set Cache-Control "no-store"
  Header set Pragma "no-cache"
  </IfModule>

Уловка для мобильного Chrome (здесь версия 93): попробуйте открыть URL-адрес в режиме «настольного сайта» - в моей ситуации это устранило постоянное кешированное перенаправление.

Чтобы отключить перенаправление, поместите этот код в индексный файл сайта перенаправления.

      <script>
    fetch('https://www.example.com', {method: 'post'}).then(() => {})
</script>

Ни очистка истории просмотра, ни отключение кэша у меня не сработали.

Чтобы избавиться от 301 перенаправления мне пришлось использовать Clear site data в хроме.

Другие вопросы по тегам