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

383

Я отлаживаю проблему с постоянным перенаправлением 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 кешируются, но не очищаются при перезапуске браузера, так когда они будут очищаться?
Liam
источник
7
Пожалуйста, скажите chrome, что нам нужен выход из этой дыры 301: bugs.chromium.org/p/chromium/issues/…
BT
@BT, поскольку проблема затрагивает все браузеры, на самом деле это может исправить только IETF, возможно, путем определения некоторого обязательного тайм-аута в кэшированных 301-х, которые не имеют TTL, так что браузеры в конечном итоге будут перепроверять свои предположения в кэше.
McGuireV10
1
Я начал обсуждение в списке рассылки IETF по этому поводу, если кому-то, кто все еще следит за этой проблемой, хочется взвешиваться: lists.w3.org/Archives/Public/ietf-http-wg/2017OctDec/0363.html
McGuireV10

Ответы:

300

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

thomasrutter
источник
18
Кроме того, есть ли у вас ссылки, которые показывают, что браузеры обрабатывают постоянные циклические перенаправления путем повторного получения исходного URL?
Кевин Кристофер Генри
7
301 редирект назад не работает, браузер все еще кеширует старый 301 редирект и я вижу бесконечный цикл
Юрий Колодовский
5
как я сделал тест: некоторое время назад я делал 301 редирект для http://www.SOMEHOST.comк https://www.SOMEHOST.com. Но сейчас http://www.SOMEHOST.comдолжен быть основной хост для сайта. Итак, перенаправление с https на http удалено. Как вы показываете, я сделал перенаправление 301 из https://www.SOMEHOST.comв http://www.SOMEHOST.com, но увидеть цикл. Браузер не перечитал ...
Юрий Колодовский
8
Я подтверждаю, что перенаправление назад (с перенаправлением PHP в моем случае) прекрасно работает в Google Chrome, если (очевидно) вы удалили начальное перенаправление 301.
Винсент Пуарье
15
Я могу подтвердить, что перенаправление назад работает отлично. Браузеры, видя цикл перенаправления, делают записи кэша недействительными. Протестировано на IE11, Firefox 52, Safari 10, Chrome 57.
Munhitsu
258

Из Chrome 71

Чтобы очистить постоянное перенаправление, перейдите в chrome: // settings / clearBrowserData и оттуда только очистка «кэшированных изображений и файлов» очистит перенаправление.

Хром 48-70

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

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

McGuireV10
источник
14
Что касается Chrome версии 54, это, к сожалению, не работает для меня.
pwagner
4
Подумав, я не ответил на реальный вопрос: «Как долго браузеры кэшируют 301?», И мой ответ не помог бы никому, кто перенаправил публичный сайт, где вам, вероятно, нужен какой-то способ навсегда отменить 301. не зная, сколько браузеров в дикой природе кэшировали перенаправление - другие ответы частично касаются этого сценария. Мой ответ действительно полезен только разработчикам или сценариям интрасети, где вы можете общаться со всеми затронутыми пользователями.
McGuireV10
1
Работает в Chrome версии 68.0.3440.106 (Официальная сборка)
Thum Choon Tat
12
chrome: // net-internals был выпотрошен в Chrome 71. Раскрывающийся раздел / Инструменты пропал. Существует DNS> Кэш распознавателя хоста> Кнопка очистки кэша хоста, но это не работает для удаления кэшированных 301-х.
t-jam
52
В Chrome 71 chrome: // settings / clearBrowserData и оттуда только очистка «кэшированных изображений и файлов» очищала перенаправление.
Бемму
179

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

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

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

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

Olaf
источник
14
Это работает, и даже после повторного включения кэширования перенаправление исчезает. СПАСИБО!
Migg
2
Похоже, что это не работает для доменов, указанных на 127.0.0.1 через локальный файл hosts. Есть ли другой вариант для этого случая?
pwagner
Не работает, если перенаправление непреднамеренно указывает на другой порт, например, с localhost:8000на localhost(порт 80). Я также очистил все данные сайта / приложения от localhost и localhost: 8000, но это не помогло.
Dennis98
3
Это решение работает в Chrome по состоянию на 16 ноября 2019 года, версия 78.0.3904.97. Другие решения больше не доступны. После того, как вы запустите его, вы можете закрыть инструменты разработчика, и он продолжит работать должным образом.
Питер Вустер
Принят ответ.
Айсеннусси
43

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

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>
Кртек Нет
источник
2
Я согласен, что это лучший метод, который я нашел, чтобы открутить его.
Esjay
в отличие от других ответов, этот метод подходит для решения проблем других людей без открытия консоли разработчика! спасибо
Алексей Рытиков
4
fetch ('URL', {method: 'POST'}) или делать то же самое. Спасибо! Это спасло меня от головной боли!
Кельвин
Я не могу поверить, что это единственный способ, который сработал для меня (сначала я попробовал все другие методы - даже сбой консоли fetch () из-за политики безопасности на нескольких сайтах).
user36388
24

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
Алекс Дж
источник
12
Хотя это технически правильно, ваш ответ не отвечает на вопрос пользователей и, следовательно, не отвечает на вопрос, для которого я пришел сюда. Когда истекает срок действия существующих кэшей 301 с заголовками, уже имеющихся в браузере, для основных браузеров?
грабить
Если кому-то все еще интересно, по этой ссылке инструкции можно переключать кеш на 301.
Francisco Presencia
Ссылка для FF, и она не работает для меня. Установленное расширение для веб-разработчиков 1.2.5 и использование FF 23.0.1
phu
вопрос не был дан ответ. Вопрос был в том, как долго будет кешироваться перенаправление, если не указана дата истечения срока
Деннис Флэгг,
22

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

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

контекстное меню сетевого вызова

Раджеш Пол
источник
1
Большое спасибо! Простое решение и работало! Этот способ должен работать и в будущем.
sgon00
16

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

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

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

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

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

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

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

перейти к URL:

chrome://settings/clearBrowserData

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

  • выберите только: cached images and files .
  • выберите время: from beginning
Джон Трайб
источник
Работаю в Chrome 79!
webaholik
Работаю в Chrome 80, спасибо!
Иосиф
6

как ответ @thomasrutter

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

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

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

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

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

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

  1. от 301 до b.com

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

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

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

Фил Хан
источник
2
Но тогда у вас все еще есть 301 от b.com: (- грязное исправление
BT
1
Можете ли вы очистить перенаправление, выпустив еще 301 с другой страницы? например ( a.com301 -> b.com) (удалить a.com301) (добавить a.com/abcdefg301 -> a.com) и заставить клиента просматривать a.com/abcdefgкак-то?
nemec
Спасибо, это работает! Протестировано на IE11, Firefox 52, Safari 10, Chrome 57
Munhitsu
У меня была ситуация, когда хотел использовать как a.com, так и b.com. Таким образом, b.com 301 a.com не был вариантом. Нашим решением было перейти на HTTPS - у нас не было перенаправлений на HTTPS
rosell.dk
6

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

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

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

T.Todua
источник
Это было понижено, вероятно, потому, что основное обещание «частного окна» не в том, чтобы ЗАПИСАТЬ кэш, но все же может ПРОЧИТАТЬ / ПОЛУЧИТЬ их. НО для меня на Firefox 37.0.1 (Linux) это работало и было очень быстрым и полезным. Приватное окно отражает текущие / не кэшированные настройки веб-сервера, тогда как обычные вкладки браузера используют кешированное перенаправление 301.
alfonx
alfonx: закрытое окно не может повторно использовать кэш просто потому, что владелец сервера может использовать элементы в виде файлов cookie, раскрывающих предыдущую личность этого пользователя. Хотя я должен признать , что кэш повторное использование, вероятно , безопасно против порно-ненавидя жены.
Зденек
6
Это не работает, если у вас уже есть кэшированный 301. Private действительно будет использовать перенаправленный, который кэшируется.
Jeffmcneill
1

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

yougotiger
источник
1

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

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

combatc2
источник
-1

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

Скриншот Chrome, открывающий страницу net-internals

Мухаммед Эрсан
источник
Не уверен, почему это недооценивается, Http 301 является проблемой, связанной с кэшем узла DNS
Мохаммад Эрсан