Как долго браузеры кэшируют HTTP 301? - PullRequest
319 голосов
/ 03 февраля 2012

Я отлаживаю проблему с постоянным перенаправлением 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 кешируются, но не очищаются при перезапуске браузера, так когда они очистятся?

Ответы [ 13 ]

273 голосов
/ 28 января 2014

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

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

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

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

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

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

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

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

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

Вы можете добавить заголовки, такие как 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.

232 голосов
/ 29 января 2016

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

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

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

102 голосов
/ 27 ноября 2014

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

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

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

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

32 голосов
/ 13 мая 2017

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

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>
22 голосов
/ 23 февраля 2012

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
9 голосов
/ 25 марта 2019

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

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

network call context menu

8 голосов
/ 27 декабря 2018

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

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

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

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

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

7 голосов
/ 29 декабря 2014

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

6 голосов
/ 03 декабря 2014

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

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

как ответ @thomasrutter

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

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

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

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

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

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

  1. a.com 301 to b.com

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

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

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

...