Combien de temps les navigateurs mettent-ils en cache HTTP 301?

383

Je débogue un problème avec une redirection permanente HTTP 301. Après un test rapide, il semble que Safari vide son cache de 301s lors de son redémarrage, mais pas Firefox.

Quand IE, Chrome, Firefox et Safari effacent-ils leur cache de 301?

MISE À JOUR: Par exemple, si je veux rediriger example1.comvers example2.com, mais que je l'ai accidentellement défini pour rediriger vers example3.com, c'est un problème. Je peux corriger l'erreur, mais toute personne ayant visité example1.comentre-temps aura mis en cache la redirection incorrecte example3.comet ne pourra donc pas atteindre l'un example1.comou l' autre example2.comjusqu'à ce que son cache soit vidé. Après enquête, je constate qu'il n'y avait pas d'en Cache-Control- Expirestête et que des en- têtes ont été définis. Les en-têtes pour la réponse 301 incorrecte auraient été comme ceci:

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

Mes propres tests montrent que:

  • IE7, IE8, Android 2.3.4 ne sont pas du tout mis en cache.
  • Firefox 18.0.2, Safari 5.1.7 (sous Windows 7) et Opera 12.14 tous les caches et vider le cache au redémarrage du navigateur.
  • IE10 et le cache Chrome 25, mais ne s'effacent pas au redémarrage du navigateur, alors quand seront-ils effacés?
Liam
la source
7
Veuillez dire à Chrome que nous avons besoin d'un moyen de sortir de ce trou de l'enfer 301: bugs.chromium.org/p/chromium/issues/…
BT
@BT puisque le problème affecte tous les navigateurs, seul l'IETF pourrait vraiment résoudre ce problème, probablement en définissant un délai d'expiration obligatoire sur les 301 mis en cache qui n'ont pas de TTL, afin que les navigateurs finissent par revérifier leurs hypothèses mises en cache.
McGuireV10
1
J'ai commencé une discussion sur la liste de diffusion de l'IETF à ce sujet, si quelqu'un qui continue de suivre ce problème a envie de peser: lists.w3.org/Archives/Public/ietf-http-wg/2017OctDec/0363.html
McGuireV10

Réponses:

300

Au moins deux navigateurs - Chrome et Firefox - mettront en cache une redirection 301 sans date d'expiration .

Autrement dit, il restera mis en cache aussi longtemps que le cache du navigateur pourra le contenir. Il sera supprimé du cache si vous videz manuellement le cache ou si les entrées du cache sont purgées pour faire de la place pour les nouvelles.

Vous pouvez le vérifier au moins dans Firefox en allant about:cachedans le cache disque et en le trouvant.

Je ne connais pas le comportement d'autres navigateurs, tels que IE10 / IE11. Cependant, étant donné que d'autres navigateurs le mettent en cache indéfiniment, vous devrez quand même vous en occuper.

Dans tous les navigateurs, y compris Chrome / Firefox, il est toujours possible de remplacer ce comportement par défaut à l'aide des en-têtes, comme décrit ci-dessous:

Remarque: cette réponse a été écrite en 2014 et le comportement du navigateur peut changer au fil du temps.

Si vous ne souhaitez pas que la redirection soit mise en cache

Cette mise en cache indéfinie n'est que la mise en cache par défaut de ces navigateurs en l'absence d'en-têtes Cache-Control. La logique est que vous spécifiez une redirection "permanente" et que vous ne leur donnez aucune autre instruction de mise en cache, donc ils la traiteront comme si vous vouliez la mettre en cache indéfiniment.

Les navigateurs honorent toujours les en-têtes Cache-Control et Expires comme avec toute autre réponse, s'ils sont spécifiés.

Vous pouvez ajouter des en-têtes tels que Cache-Control: max-age=3600ou Expires: Thu, 01 Dec 2014 16:00:00 GMTà vos redirections 301. Vous pouvez même ajouter Cache-Control: no-cacheafin qu'il ne soit pas mis en cache en permanence par le navigateur ou Cache-Control: no-storequ'il ne puisse même pas être stocké dans un stockage temporaire par le navigateur.

Une meilleure alternative à mon avis, cependant, consiste à utiliser une redirection 302 ou 307. Ceux-ci n'impliquent pas pour les navigateurs ou les caches qu'il s'agit de redirections "permanentes" et ne doivent donc pas être mis en cache en l'absence des en-têtes Cache-Control.

Pour moi, cela semble émettre une redirection 301, mais le marquer comme non-cache va à l'encontre de l' esprit de ce qu'est une redirection 301, même si elle peut être techniquement valide. YMMV, et vous pouvez trouver des cas limites où il est logique qu'une redirection "permanente" ait une limite de temps.

Si vous avez précédemment émis une redirection 301 mais que vous souhaitez annuler cette opération

Si les gens ont toujours la redirection 301 mise en cache dans leur navigateur, ils continueront d'être dirigés vers la page cible, que la page source ait toujours la redirection en place. Vos options pour résoudre ce problème incluent:

  • La solution la plus simple et la meilleure consiste à renvoyer une autre redirection 301.

    Le navigateur se rendra compte qu'il est redirigé vers ce qu'il pensait précédemment être une URL déclassée, ce qui devrait le faire récupérer à nouveau cette URL pour confirmer que l'ancienne redirection n'est pas encore là.

    Edit: certains commentaires jettent un doute là-dessus, voir ci-dessous.

  • Si vous ne contrôlez pas le site vers lequel la cible de redirection précédente est allée, vous avez de la chance. Essayez de demander au propriétaire du site de vous rediriger vers vous.

Aussi, mieux vaut prévenir que guérir - évitez une redirection 301 si vous n'êtes pas sûr de vouloir mettre définitivement hors service l'ancienne URL.

thomasrutter
la source
18
De plus, avez-vous des références qui montrent que les navigateurs gèrent les redirections permanentes circulaires en récupérant l'URL d'origine?
Kevin Christopher Henry
7
La redirection 301 ne fonctionne pas, le navigateur cache toujours l'ancienne redirection 301 et je vois une boucle infinie
Yuriy Kolodovskyy
5
comment je l' ai test: il y a quelque temps que je l'ai fait faire redirection 301 pour rediriger http://www.SOMEHOST.comvers https://www.SOMEHOST.com. Mais http://www.SOMEHOST.comdoit maintenant être l'hôte principal du site. Donc, redirigez de https vers http supprimé. Comme vous le montrez, j'ai fait rediriger 301 de https://www.SOMEHOST.comvers http://www.SOMEHOST.com, mais voir la boucle. Le navigateur n'a pas
récupéré
8
Je confirme que la redirection vers l'arrière (avec une redirection PHP dans mon cas) fonctionne parfaitement sur Google Chrome tant que (évidemment) vous avez supprimé la redirection 301 initiale.
Vincent Poirier
15
Je peux confirmer que la redirection retour fonctionne parfaitement bien. Les navigateurs qui voient une boucle de redirection invalident les entrées du cache. Testé sur IE11, Firefox 52, Safari 10, Chrome 57.
Munhitsu
258

Depuis Chrome 71

Pour effacer une redirection permanente, accédez à chrome: // settings / clearBrowserData et à partir de là, uniquement la suppression des "images et fichiers mis en cache" a effacé la redirection.

Chrome 48-70

Accédez à chrome: // net-internals. À droite de la barre d'état rouge supérieure, cliquez sur la flèche vers le bas ▼ pour ouvrir le menu déroulant, et sous le groupe "Outils", choisissez "Vider le cache".

À partir de la version 48, c'était la seule chose qui fonctionnait pour moi pour effacer un 301 mis en cache.

McGuireV10
la source
14
À partir de la version 54 de Chrome, cela ne fonctionne malheureusement pas pour moi.
pwagner
4
À la réflexion, je n'ai pas vraiment répondu à la vraie question, "Combien de temps les navigateurs mettent-ils en cache un 301", et ma réponse n'aiderait personne qui a redirigé un site public où vous avez probablement besoin d'un moyen pour annuler définitivement un 301 sans savoir combien de navigateurs dans la nature ont mis en cache la redirection - d'autres réponses abordent partiellement ce scénario. Ma réponse n'est vraiment utile qu'aux développeurs ou aux scénarios intranet où vous pouvez communiquer avec tous les utilisateurs concernés.
McGuireV10
1
Fonctionne dans la version Chrome 68.0.3440.106 (version officielle)
Thum Choon Tat
12
chrome: // net-internals a été vidé dans Chrome 71. La liste déroulante / Outils a disparu. Il existe un DNS> Cache de résolveur d'hôte> Bouton Effacer le cache d'hôte, mais cela ne fonctionne pas pour supprimer les 301 mis en cache.
t-jam
52
Dans Chrome 71, chrome: // settings / clearBrowserData et à partir de là uniquement la suppression des "images et fichiers mis en cache" effaçait la redirection.
Bemmu
179

Une réponse qui aide ceux qui veulent désespérément se débarrasser du cache de redirection:

Chrome met en cache la redirection 301 à l'infini (dans le cache disque local). Pour vider ce cache:

  • ouvrez vos DevTools (appuyez sur F12)
  • dans l' onglet Réseau, cochez la case "Désactiver le cache"
  • garder DevTools ouvert et recharger la page (appuyez F5)

Lorsque tout va bien, vous pouvez décocher "Désactiver le cache" et tout continuera à fonctionner comme prévu.

Olaf
la source
14
Cela fonctionne et même après avoir réactivé la mise en cache, la redirection a disparu. THX!
migg
2
Il semble que cela ne fonctionne pas pour les domaines pointés vers 127.0.0.1 via le fichier d'hôtes local. Y a-t-il une autre option pour ce cas?
pwagner
Ne fonctionne pas si la redirection pointe involontairement vers un autre port, comme from localhost:8000to localhost(port 80). J'ai également effacé toutes les données de site / application de localhost et localhost: 8000, mais cela n'a pas non plus aidé.
Dennis98
3
Cette solution fonctionne sur Chrome à partir du 16 novembre 2019 version 78.0.3904.97. Les autres solutions ne sont plus disponibles. Après l'avoir fait fonctionner, vous pouvez fermer les outils de développement et il continuera à fonctionner correctement.
Peter Wooster
Réponse acceptée.
Aysennoussi
43

Demandez à l'utilisateur de soumettre un formulaire de publication sur cette URL et la redirection en cache a disparu :)

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>
Krtek Net
la source
2
Je suis d'accord que c'est la meilleure méthode que j'ai trouvée pour la dévisser.
esjay
contrairement aux autres réponses, cette méthode est adaptée pour résoudre le problème des autres sans ouvrir la console développeur! merci
Alexey Rytikov
4
fetch ('URL', {méthode: 'POST'}) oughta faire le tour de la même manière. Merci! Cela m'a évité des maux de tête!
calvin
Je ne peux pas croire que c'est la seule façon qui a fonctionné pour moi (j'ai d'abord essayé toutes les autres méthodes - même la console fetch () a échoué en raison d'une politique de sécurité intersite).
user36388
24

301est une réponse pouvant être mise en cache par RFC HTTP et les navigateurs la mettront en cache en fonction des en-têtes de mise en cache HTTP que vous avez sur la réponse. Utilisez FireBug ou Charles pour examiner les en-têtes de réponse pour connaître la durée exacte de la mise en cache de la réponse.

Si vous souhaitez contrôler la durée de mise en cache, vous pouvez utiliser les en-têtes de réponse HTTP Cache-Controlet Expiresfaire de même. Sinon, si vous ne voulez pas du tout mettre en cache la 301réponse, utilisez les en-têtes suivants.

Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Alex J
la source
12
Bien que techniquement correcte, votre réponse ne répond pas à la question des utilisateurs et ne répond donc pas à la question pour laquelle je suis venu ici. Quand les 301 existants, qui ne sont pas mis en cache et qui sont déjà dans le navigateur, expirent-ils pour les principaux navigateurs?
voler le
Si quelqu'un est toujours intéressé, ces instructions de lien peuvent basculer le cache pour 301.
Francisco Presencia
Le lien est pour FF et cela n'a pas fonctionné pour moi. Installé l'extension de développeur Web 1.2.5 et en utilisant FF 23.0.1
un phu
la question est restée sans réponse. La question était de savoir pendant combien de temps la redirection sera mise en cache si aucune date d'expiration n'a été spécifiée
Dennis Flagg
22

Il existe un moyen très simple de supprimer le cache du navigateur pour les redirections http, par exemple 301, 307, etc.

Vous pouvez ouvrir le panneau réseau dans la console développeur en chrome. Sélectionnez l'appel réseau. Faites un clic droit dessus, puis cliquez sur Vider le cache du navigateur pour supprimer la redirection mise en cache.

menu contextuel des appels réseau

Rajesh Paul
la source
1
Merci beaucoup! Solution simple et travaillée! Cette méthode devrait également fonctionner à l'avenir.
sgon00
16

Confirmé!! obliger l'utilisateur à soumettre une demande de publication à l'URL affectée et la redirection en cache est oubliée.

Un gain rapide serait de saisir ceci dans la console du navigateur si vous pouvez:

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

Utile si vous connaissez le navigateur affecté (en particulier pendant le développement).

Alternativement , si vous avez accès à la page de redirection 301 précédente, vous pouvez ajouter ce script à la page et chaque fois qu'il sera visité, le 301 mis en cache sera oublié.

Emeke Ajeh
la source
Ceci est similaire au formulaire de publication ci-dessus, mais c'est moins d'effort.
jpswade
C'est vrai @jpswade
Emeke Ajeh
13

Je posterai une réponse qui m'a aidé:

aller à l'url:

chrome://settings/clearBrowserData

il devrait invoquer un popup puis ..

  • sélectionnez uniquement: cached images and files.
  • sélectionnez la zone de temps: from beginning
John Tribe
la source
Travailler dans Chrome 79!
webaholik
Travailler dans Chrome 80, merci!
Joseph
6

comme réponse de @thomasrutter

Si vous avez précédemment émis une redirection 301 mais que vous souhaitez annuler cette opération

Si les gens ont toujours la redirection 301 mise en cache dans leur navigateur, ils continueront d'être dirigés vers la page cible, que la page source ait toujours la redirection en place. Vos options pour résoudre ce problème incluent:

La solution la plus simple et la meilleure consiste à renvoyer une autre redirection 301.

Le navigateur se rendra compte qu'il est redirigé vers ce qu'il pensait auparavant être une URL déclassée, et cela devrait le faire récupérer à nouveau cette URL pour confirmer que l'ancienne redirection n'est pas encore là.

Si vous ne contrôlez pas le site vers lequel la cible de redirection précédente est allée, vous avez de la chance. Essayez de demander au propriétaire du site de vous rediriger vers vous.

En fait, cela signifie:

  1. a.com 301 à b.com

  2. supprimer les 301 de a.com

  3. ajouter b.com 301 à a.com

Alors ça marche.

phil han
la source
2
Mais alors vous avez toujours le 301 de b.com qui traîne: (- un correctif sale
BT
1
Pouvez-vous effacer une redirection en émettant un autre 301 à partir d'une page différente ? par exemple ( a.com301 -> b.com) (supprimer a.comle 301) (ajouter a.com/abcdefg301 -> a.com) et forcer le client à visualiser d'une a.com/abcdefgmanière ou d'une autre?
nemec
Merci ça marche! Testé sur IE11, Firefox 52, Safari 10, Chrome 57
Munhitsu
J'ai eu une situation où je voulais utiliser à la fois a.com et b.com. Donc b.com 301 a.com n'était pas une option. Notre solution était de passer à HTTPS - nous n'avons eu aucune redirection sur HTTPS
rosell.dk
6

J'ai une solution simple qui a fonctionné sur tous les principaux navigateurs (dernière version), notamment IE, Chrome et FF

  1. Ctrl + Maj + Suppr
  2. -
    1. Chrome: sélectionnez "Historique de navigation" et "Cache ..."
    2. IE: Je laisse l'option par défaut "Fichiers Internet temporaires et fichiers de site Web", "Cookies et données de site Web", "Historique"
    3. FF: "Historique de navigation et de téléchargement", "Cache"
  3. Cliquez sur "Supprimer"
  4. Fermez et rouvrez votre navigateur. Ça devrait marcher
Dung Le
la source
Vous devez également vous assurer que vous n'êtes pas sur la page en question, car certains navigateurs n'effacent pas les éléments mis en cache des pages ouvertes.
Oliver Schimmer
6

À des fins de test (pour éviter les redirections mises en cache), les utilisateurs peuvent ouvrir une NOUVELLE FENÊTRE PRIVÉE : cliquez sur CTRL+SHIFT+N[si vous utilisez Mozilla, utilisez P]

T.Todua
la source
Cela a été minimisé, probablement parce que la principale promesse de la "fenêtre privée" n'est pas d'écrire dans les caches, mais peut toujours les lire / réutiliser. MAIS pour moi sur Firefox 37.0.1 (Linux), cela a fonctionné et a été très rapide et utile. La fenêtre privée reflète les paramètres actuels / non mis en cache du serveur Web, tandis que les onglets de navigateur normaux utilisent une redirection 301 mise en cache.
alfonx
alfonx: La fenêtre privée peut ne pas réutiliser le cache simplement parce que le propriétaire du serveur pourrait utiliser les éléments de manière cookie révélant l'identité précédente de cet utilisateur. Bien que je dois concéder que la réutilisation du cache est probablement sans danger contre une femme qui déteste le porno.
Zdenek
6
Cela ne fonctionne pas si vous avez déjà un 301. mis en cache. Private utilisera en effet la redirection qui est mise en cache.
jeffmcneill
1

Testez vos redirections en utilisant le mode incognito / InPrivate pour que lorsque vous fermez le navigateur, il videra ce cache et la réouverture de la fenêtre ne contiendra pas le cache.

yougotiger
la source
1

Comme le montrent les autres réponses. La mise en cache peut être indéfiniment dans le navigateur. C'est extrêmement dangereux. Alors ne le fais pas. Ajoutez au moins des en-têtes de cache. Dans htaccess, je le fais toujours de cette façon avec maintenant la mise en cache du tout:

<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
la source
1

Pour résoudre le problème d'une adresse d'hôte local, j'ai changé le numéro de port sous lequel le site fonctionnait. Cela a fonctionné sur la version 73.0.3683.86 de Chrome.

combatc2
la source
-1

Sur la dernière version de Google Chrome 79, vous pouvez utiliser le chrome: // net-internals et sélectionner DNS dans le panneau de gauche, puis appuyez sur le bouton Vider le cache de l'hôte

Capture d'écran de Chrome ouvrant la page Net-Internals

Mohammad Ersan
la source
Vous ne savez pas pourquoi cela est rétrogradé, Http 301 est un problème lié au cache d'hôte DNS
Mohammad Ersan