Як довго браузери кешують HTTP 301?


380

Я налагоджую проблему з постійним перенаправленням HTTP 301. Після швидкого тестування, здається, що Safari очищає кеш-пам'ять 301s при його перезапуску, але 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 кеш, але не очистить перезавантаження браузера, тож коли вони очистять?

7
Скажіть, будь ласка, хромоване, що нам потрібен вихід із цієї пекельної ями: bugs.chromium.org/p/chromium/isissue/…
BT,

@BT оскільки проблема стосується всіх браузерів, справді лише ІЕТФ може це виправити, ймовірно, визначивши деякий обов’язковий тайм-аут для кешованих 301, які не мають TTL, щоб браузери врешті-решт перевірили свої кешовані припущення.
McGuireV10

1
Я розпочав обговорення у списку розсилки IETF з цього приводу, якщо хтось, хто все ще переглядає цю проблему, вважає зваженим
McGuireV10

Відповіді:


299

Принаймні два браузери - Chrome і Firefox - кешуватимуть переадресацію 301 без дати закінчення терміну дії .

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

Ви можете перевірити це принаймні у Firefox, перейшовши about:cacheта знайшовши його в кеш-диску.

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

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

Примітка. Ця відповідь була написана в 2014 році, і поведінка браузера може змінюватися з часом.

Якщо ви не хочете, щоб переспрямування було кешоване

Це невизначене кешування - це кешування за замовчуванням у цих браузерах за відсутності заголовків кеш-керування. Логіка полягає в тому, що ви вказуєте "постійне" переспрямування і не даєте їм жодних інших інструкцій щодо кешування, тому вони будуть ставитися до нього так, як ніби ви хотіли, щоб це було визначено кешований на невизначений термін.

Браузери все ще вшановують заголовки кеша-керування та закінчується, як і будь-яку іншу відповідь, якщо вони вказані.

Ви можете додати заголовки, такі як 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. Вони не означають браузерам або кешам, що вони є "постійними" переадресаціями, і, таким чином, не слід кешувати їх відсутністю у заголовках кеш-керування.

Мені здається, що видача переадресації 301, але позначення її як не кешованої суперечить духу того, для чого потрібне переадресація 301, навіть якщо це технічно є дійсним. YMMV, і ви можете виявити крайові випадки, коли "постійне" перенаправлення має сенс мати часовий обмеження.

Якщо ви раніше видавали переспрямування 301, але хочете цього не робити

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

  • Найпростіше і найкраще рішення - знову зробити ще одну переадресацію 301.

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

    Редагувати: деякі коментарі викликають сумніви щодо цього, дивіться нижче.

  • Якщо у вас немає контролю над сайтом, на який пішла попередня ціль переадресації, то вам не пощастить. Спробуйте і попросіть власника сайту переспрямувати вас назад.

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


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 і звідти лише очищення "кешованих зображень та файлів" очистило переспрямування.

Chrome 48-70

Перейдіть до chrome: // net-Internals. Праворуч від верхньої червоної смуги стану натисніть на стрілку вниз ▼, щоб відкрити випадаюче меню, а в групі "Інструменти" виберіть "Очистити кеш".

Щодо версії 48, це було єдине, що працювало для мене, щоб очистити кешований 301.


14
Що стосується версії 54 Chrome, це, на жаль, не працює для мене.
pwagner

4
По-друге, я дійсно не відповів на справжнє запитання "Скільки часу браузери кешують 301", і моя відповідь не допомогла б тому, хто перенаправив публічний сайт, куди вам, певно, потрібен спосіб назавжди скасувати 301 не знаючи, скільки браузерів у дикій природі заховано керування переадресацією - інші відповіді частково стосуються цього сценарію. Моя відповідь дійсно корисна лише розробникам або інтранет-сценаріям, де ви можете спілкуватися з усіма впливовими користувачами.
McGuireV10

1
Працює у версії Chrome 68.0.3440.106 (Офіційна збірка)
Thum Choon Tat

12
chrome: // net-Internals виникла в Chrome 71. Роздільний список / Інструменти відсутній. Існує DNS> Кеш розв’язувача хоста> Очистити кнопку кешу хоста, але це не працює для видалення кешованих 301s.
t-jam

52
У Chrome 71, chrome: // settings / clearBrowserData і звідти лише очищення "кешованих зображень та файлів" очистило переспрямування.
Бемму

179

Відповідь, яка допомагає тим, хто відчайдушно хоче позбутися кешу переспрямування:

Chrome кешує переспрямування 301 нескінченно (у локальному кеш-диску). Щоб очистити цей кеш:

  • відкрийте свій DevTools (натиснітьF12 )
  • на вкладці Мережа встановіть прапорець "Вимкнути кеш-пам'ять" прапорець
  • тримайте DevTools відкритим і перезавантажуйте сторінку (натисніть F5)

Коли все в порядку, ви можете зняти прапорець "Вимкнути кеш-пам'ять", і все продовжить працювати, як очікувалося.


14
Це працює, і навіть після повторного ввімкнення кешування перенаправлення більше не відбувається. ДЯКУЮ!
migg

2
Схоже, це не працює для доменів, вказаних на 127.0.0.1, через файл локальних хостів. Чи є інший варіант для цього випадку?
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', {метод: 'POST'}) повинен виконувати трюк так само. Дякую! Це врятувало мені певний головний біль!
Кельвін

Я не можу повірити, що це єдиний спосіб, який працював на мене (я спробував спочатку всі інші методи - навіть консоль вибору () не вдався через політику безпеки на різних сайтах).
користувач36388

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

на запитання не відповіли. Питання полягало в тому, як довго буде кешовано переспрямовування, якщо не вказано термін придатності
Dennis Flagg

21

Існує дуже простий спосіб видалити кеш браузера для переспрямувань http, наприклад 301, 307 тощо.

Можна відкрити мережеву панель в консолі розробника в хромі. Виберіть мережевий дзвінок. Клацніть правою кнопкою миші та натисніть Очистити кеш браузера, щоб видалити кешоване перенаправлення.

контекстне меню мережевого дзвінка


1
Дуже дякую! Просте рішення та працювали! Цей шлях повинен працювати і в майбутньому.
sgon00

16

Підтверджено !! змусити користувача надіслати запит на публікацію до URL-адреси, що впливає, і кешоване переспрямування буде забуто

Швидкий виграш - це ввести це на консолі браузера, якщо ви можете:

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

Корисно, якщо ви знаєте, про який браузер постраждали (особливо під час розробки).

Крім того , якщо у вас є доступ до попередньої сторінки переспрямування 301, ви можете додати цей скрипт на сторінку, і коли він буде відвіданий, кешований 301 буде забутий.


Це схоже на форму публікації вище, тільки це менше зусиль.
jpswade

Це правильно @jpswade
Emeke Ajeh

12

Я опублікую відповідь, яка допомогла мені:

перейти до URL:

chrome://settings/clearBrowserData

він повинен викликати спливаюче вікно, а потім ..

  • вибрати лише: cached images and files .
  • виберіть вікно часу: from beginning

Робота в Chrome 79!
webaholik

Робота в Chrome 80, дякую!
Йосип

6

як відповідь @thomasrutter

Якщо ви раніше видавали переспрямування 301, але хочете цього не робити

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

Найпростіше і найкраще рішення - знову зробити ще одну переадресацію 301.

Веб-переглядач зрозуміє, що він спрямований назад до того, що він вважав раніше виведеною з експлуатації, і це повинно змусити його повторно отримати цю URL-адресу, щоб підтвердити, що старого переспрямування ще немає.

Якщо у вас немає контролю над сайтом, на який пішла попередня ціль переадресації, то вам не пощастить. Спробуйте і попросіть власника сайту переспрямувати вас назад.

Насправді це означає:

  1. a.com 301 до b.com

  2. видалити 301 a.com

  3. додати b.com 301 до a.com

Тоді це працює.


2
Але тоді у вас все ще лежить 301 b.com: (- брудне виправлення
BT

1
Чи можете ви очистити переспрямування, видавши ще 301 з іншої сторінки? наприклад ( a.com301 -> b.com) (delete 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]


Це було зменшено, ймовірно, тому, що головна обіцянка "приватного вікна" - це НЕ ЗАПИСИТЬ кеш-пам'ять, але все одно їх можна читати / повторно використовувати. Але для мене на Firefox 37.0.1 (Linux) це спрацювало і було дуже швидким і корисним. Приватне вікно відображає поточні / некешовані налаштування веб-сервера, тоді як звичайні вкладки браузера використовують кешоване переадресацію 301.
alfonx

alfonx: приватне вікно може не використовувати кеш-пам'ять просто тому, що власник сервера може використовувати елементи у файлі cookie, розкриваючи попередню особу цього користувача. Хоча я повинен визнати, що повторне використання кешу, ймовірно, безпечно проти порно ненависної дружини.
Зденек

6
Це не спрацьовує, якщо у вас вже є кешоване 301. Приватний дійсно використовуватиме переспрямований кеш.
jeffmcneill

1

Тестуйте свої переадресації, використовуючи режим інкогніто / InPrivate, так що коли ви закриєте браузер, він кеш-пам’яті перезапустить кеш і повторне відкриття вікна не буде містити кеш-пам'ять.


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>

1

Щоб вирішити проблему для адреси localhost, я змінив номер порту, під яким працює сайт. Це працювало у версії Chrome 73.0.3683.86.


-1

В останній версії Google Chrome 79 можна скористатися chrome: // net-internes та вибрати на DNS на панелі ліворуч, а потім натиснути кнопку Очистити кеш-пам'ять хоста

Скріншот хромування, який відкриває сторінку net-Internals


Не впевнений, чому це сприйнято, Http 301 - це проблема кешу DNS-хоста
Mohammad Ersan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.