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

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

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

UPDATE: Например, если я хочу перенаправить example1.com на example2.com , но я случайно настроил его redirect на 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, но не очищаются от перезапуска браузера, поэтому, когда они очистятся?

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

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

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

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

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

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

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

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

    Браузеры по-прежнему считают заголовки 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. Это не означает, что браузеры или кеши являются «перманентными» redirectм и поэтому не должны кэшироваться в отсутствие заголовков Cache-Control.

    Для меня это похоже на то, что вы отправляете 301 redirect, но отмечаете, что он не кэшируемый, идет вразрез с духом того, для чего предназначен переадресация 301, хотя это может быть технически обоснованным. YMMV, и вы можете найти краевые случаи, когда имеет смысл для «постоянного» перенаправления иметь ограничение по времени.

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

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

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

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

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

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

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

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

    Начиная с версии 48, это было единственное, что помогло мне очистить кешированный 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 

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

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

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

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

      

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

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

    как ответ @thomasrutter

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

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

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

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

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

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

    1. a.com 301 to b.com

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

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

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

    Для целей тестирования (так, без кэшированных переадресаций), люди могут открывать NEW PRIVATE WINDOW : нажмите CTRL+SHIFT+ N [или P ]

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

    Давайте будем гением компьютера.