439 votes

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

Je suis en train de déboguer un problème avec une redirection permanente HTTP 301. Après un test rapide, il semble que Safari vide son cache des 301 lorsqu'il est redémarré, mais pas Firefox.

Quand IE, Chrome, Firefox et Safari vident-ils leur cache des 301 ?

MISE À JOUR : Par exemple, si je veux rediriger example1.com a example2.com mais je l'ai accidentellement paramétré pour qu'il redirige vers example3.com c'est un problème. Je peux corriger l'erreur, mais toute personne qui a visité example1.com entre-temps aura mis en cache la redirection incorrecte vers example3.com et ne pourront donc atteindre ni l'un ni l'autre. example1.com o example2.com jusqu'à ce que leur cache soit vidé. Après enquête, j'ai découvert qu'il n'y avait pas Cache-Control y Expires Les en-têtes sont fixés. Les en-têtes de la réponse 301 incorrecte auraient été les suivants :

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 le montrent :

  • IE7, IE8, Android 2.3.4 n'ont pas de cache du tout.
  • Firefox 18.0.2, Safari 5.1.7 (sur Windows 7) et Opera 12.14, tous les caches, et vider le cache au redémarrage du navigateur.
  • IE10 et Chrome 25 ont un cache, mais ne le vident pas au redémarrage du navigateur, Alors, quand est-ce qu'ils vont se libérer ?

12 votes

S'il vous plaît, dites à Chrome que nous avons besoin d'un moyen de sortir de ce trou de l'enfer 301 : bugs.chromium.org/p/chromium/issues/

0 votes

Comme le problème affecte tous les navigateurs, seul l'IETF pourrait le résoudre, probablement en définissant un délai obligatoire pour les 301 en cache qui n'ont pas de TTL, de sorte que les navigateurs finissent par revérifier leurs hypothèses en cache.

1 votes

J'ai lancé une discussion sur la liste de diffusion de l'IETF à ce sujet, si quelqu'un qui suit encore cette question a envie de s'exprimer : lists.w3.org/Archives/Public/ietf-http-wg/2017OctDec/0363.html

340voto

thomasrutter Points 42905

En l'absence de directives de contrôle du cache qui spécifient le contraire, une redirection 301 est mise en cache par défaut sans date d'expiration.

C'est-à-dire qu'il restera en mémoire cache aussi longtemps que le cache du navigateur pourra l'accueillir. Il sera supprimé du cache si vous videz manuellement le cache ou si les entrées du cache sont purgées pour faire place à de nouvelles entrées.

Vous pouvez le vérifier, au moins dans Firefox, en allant à l'adresse suivante about:cache et le trouver dans le cache du disque. Cela fonctionne de la même manière dans d'autres navigateurs, y compris Chrome et Edge, basé sur Chromium, bien qu'ils ne disposent pas d'une fonction de recherche dans la mémoire cache. about:cache pour inspecter le cache.

Dans tous les navigateurs, il est toujours possible de passer outre ce comportement par défaut en utilisant des directives de mise en cache, comme décrit ci-dessous :

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

Cette mise en mémoire indéfinie n'est que le par défaut la mise en cache par ces navigateurs en l'absence d'en-têtes spécifiant le contraire. La logique est que vous spécifiez une redirection "permanente" et que vous ne leur donnez pas d'autres instructions de mise en cache, de sorte qu'ils la traiteront comme si vous vouliez qu'elle soit mise en cache indéfiniment.

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

Vous pouvez ajouter des en-têtes tels que Cache-Control: max-age=3600 o Expires: Thu, 01 Dec 2014 16:00:00 GMT à vos redirections 301. Vous pouvez même ajouter Cache-Control: no-cache afin qu'il ne soit pas mis en cache de façon permanente par le navigateur ou par l'utilisateur. Cache-Control: no-store donc il ne peut même pas être stocké dans un stockage temporaire par le navigateur.

Toutefois, si vous ne souhaitez pas que votre redirection soit permanente, il est préférable d'utiliser une redirection 302 ou 307. Le fait d'émettre une redirection 301 mais de la marquer comme non cachable va à l'encontre de la politique de confidentialité de l esprit de ce à quoi sert une redirection 301, même si elle est techniquement valide. YMMV, et vous pouvez trouver des cas limites où il est logique pour une redirection "permanente" d'avoir une limite de temps. Notez que les redirections 302 et 307 ne sont pas mises en cache par défaut par les navigateurs.

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

Si les internautes ont toujours la redirection 301 en cache dans leur navigateur, ils continueront d'être dirigés vers la page cible, même si la page source a toujours la redirection en place. Vous avez plusieurs possibilités pour résoudre ce problème :

  • Une solution simple consiste à émettre une nouvelle redirection.

    Si le navigateur est redirigé vers une même URL une deuxième fois au cours d'une redirection, il doit la récupérer depuis l'origine au lieu de la rediriger à nouveau depuis le cache, afin d'éviter une boucle de redirection. Les commentaires sur cette réponse indiquent que cela fonctionne maintenant dans tous les principaux navigateurs - mais il peut y avoir quelques navigateurs mineurs où ce n'est pas le cas.

  • Si vous n'avez pas le contrôle du site vers lequel la cible de redirection précédente est allée, alors vous n'avez pas de chance. Essayez de supplier le propriétaire du site de vous rediriger vers lui.

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.

0 votes

Excellente réponse. À mon avis, cependant, étant donné que la norme HTTP mentionne spécifiquement la modification du temps de cache pour les redirections 301, ces redirections permanentes "impermanentes" sont bien dans l'esprit de la norme.

19 votes

Par ailleurs, 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 ?

10 votes

La redirection 301 ne fonctionne pas, le navigateur cache toujours l'ancienne redirection 301 et je vois une boucle infinie.

284voto

McGuireV10 Points 380

Depuis Chrome 71

Pour effacer une redirection permanente, allez dans chrome://settings/clearBrowserData et à partir de là, seul le fait d'effacer "images et fichiers en cache" efface la redirection.

Chrome 48-70

Allez sur 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 dans le groupe "Outils", choisissez "Vider le cache".

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

14 votes

Depuis la version 54 de Chrome, cela ne fonctionne malheureusement pas pour moi.

0 votes

Je dois ajouter que j'ai une entrée dans mon /etc/hosts qui fait pointer le domaine vers 127.0.0.1 - c'est très probablement pertinent.

0 votes

Fonctionne dans la version 60.0.3112.101 (Official Build) (64-bit)

205voto

Olaf Points 4376

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 du disque local). Pour vider ce cache :

  • ouvrez votre DevTools (presse F12 )
  • sur le Réseau vérifiez l'onglet "Désactiver le cache" case à cocher
  • garder DevTools ouvert et recharger la page (appuyez sur F5 )

Lorsque tout est en ordre, vous pouvez décocher la case "Désactiver le cache" et tout continuera à fonctionner comme prévu.

2 votes

Il semble que cela ne fonctionne pas pour les domaines pointant vers 127.0.0.1 via le fichier hosts local. Existe-t-il une autre option pour ce cas ?

0 votes

Cela ne fonctionne pas si la redirection, involontairement, pointe vers un autre port, comme de localhost:8000 a localhost (port 80). J'ai également effacé l'ensemble des données du site/de l'application à la fois de localhost et de localhost:8000, mais cela n'a rien changé.

4 votes

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.

72voto

Rajesh Paul Points 1706

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 du développeur dans Chrome. Sélectionnez l'appel réseau. Faites un clic droit dessus, puis cliquez sur Effacer le cache du navigateur pour supprimer la redirection en cache.

network call context menu

1 votes

Merci beaucoup ! Solution simple et qui a fonctionné ! Cette méthode devrait également fonctionner à l'avenir.

51voto

Krtek Net Points 654

Faites en sorte que l'utilisateur soumette un formulaire de poste sur cette url et la redirection en cache disparaît :)

<body onload="document.forms[0].submit()">
<form action="https://forum.pirati.cz/unreadposts.html" method="post">
    <input type="submit" value="fix" />
</form>
</body>

2 votes

Je suis d'accord, c'est la meilleure méthode que j'ai trouvée pour le dévisser.

1 votes

Contrairement aux autres réponses, cette méthode permet de résoudre le problème d'autres personnes sans ouvrir la console du développeur ! merci

4 votes

Fetch('URL', {méthode : 'POST'}) devrait faire l'affaire de la même manière. Merci ! Cela m'a épargné quelques maux de tête !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X