web-dev-qa-db-fra.com

Combien de temps les navigateurs cachent-ils HTTP 301?

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

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

UPDATE: Par exemple, si je veux rediriger example1.com vers example2.com, mais que je l'ai accidentellement configuré pour rediriger vers example3.com, c'est un problème. Je peux corriger l'erreur, mais toute personne ayant visité example1.com entre-temps aura mis en cache la redirection incorrecte vers example3.com et ne pourra donc pas accéder à example1.com ni à example2.com tant que son cache n'aura pas été vidé. Après enquête, je constate qu’il n’ya pas d’en-têtes Cache-Control et Expires. 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 mettent pas du tout en cache.
  • Cachez tous les cache de Firefox 18.0.2, Safari 5.1.7 (sous Windows 7) et Opera 12.14, puis effacez le cache au redémarrage du navigateur.
  • Cache IE10 et Chrome 25, mais ne pas effacer au redémarrage du navigateur, quand seront-ils effacés?
275
Liam

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

En d'autres termes, il restera mis en cache aussi longtemps que le cache du navigateur pourra le gérer. Il sera supprimé du cache si vous effacez manuellement le cache ou si les entrées du cache sont purgées pour laisser de la place aux nouvelles.

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

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 accommoder. 

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

Remarque: cette réponse a été écrite en 2014 et le comportement du navigateur peut évoluer dans le temps.

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

Cette mise en cache indéfinie n'est que la mise en cache default 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 pas d'autres instructions de mise en cache, ils le traiteront donc comme si vous souhaitiez la mettre en cache indéfiniment.

Les navigateurs respectent toujours les en-têtes Cache-Control et Expires comme avec toute autre réponse, si elles sont spécifiées.

Vous pouvez ajouter des en-têtes tels que Cache-Control: max-age=3600 ou 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 manière permanente par le navigateur ou Cache-Control: no-store; il ne peut même pas être stocké dans une mémoire temporaire par le navigateur.

Une meilleure alternative à mon avis, cependant, consiste à utiliser une redirection 302 ou 307. Cela n'implique pas aux navigateurs ou aux caches qu'il s'agit de redirections "permanentes" et ne devrait donc pas être mis en cache en l'absence d'en-têtes Cache-Control.

Pour moi, il me semble émettre une redirection 301, mais le marquer comme non cacheable va à l’encontre de la spirit de ce à quoi sert une redirection 301, même si elle est techniquement valide. YMMV, et vous pouvez trouver des cas Edge où il est logique pour une redirection "permanente" d'avoir une limite de temps.

Si vous avez déjà émis une redirection 301 mais que vous souhaitez annuler cette opération

Si les utilisateurs ont toujours la redirection 301 en cache dans leur navigateur, ils continueront d'être redirigés vers la page cible, que la redirection soit toujours en place ou non sur la page source. Vos options pour résoudre ce problème incluent:

  • La solution la plus simple et la meilleure consiste à émettre à nouveau une nouvelle redirection 301.

    Le navigateur réalisera qu'il est redirigé vers ce qu'il pensait être auparavant une URL désactivée, ce qui devrait entraîner une nouvelle extraction de cette URL pour confirmer que l'ancienne redirection n'existe pas encore.

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

  • Si vous n'avez pas le contrôle sur le site où la cible de redirection précédente est allée, vous avez plus de chance. Essayez de supplier le propriétaire du site de vous rediriger.

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

245
thomasrutter

Pour effacer une redirection permanente, accédez à chrome: // net-internals. Sur la droite de la barre d'état rouge supérieure, cliquez sur la flèche vers le bas ▼ pour ouvrir le menu déroulant, puis sous le groupe "Outils", choisissez "Effacer le cache".

Depuis la version 48, c’est la seule chose qui a fonctionné pour moi pour effacer un fichier 301 mis en cache.

Mise à jour: Malheureusement, à compter de la version 71 (décembre 2018), Google a supprimé la fonctionnalité net-internals.

217
McGuireV10

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

  • ouvrez votre DevTools (appuyez sur F12)
  • sur l'onglet Réseau cochez la case "Disable cache" checkbox
  • garder DevTools ouvert et recharger la page (appuyer sur F5)

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

Cela a fonctionné pour moi dans Chrome 39, mais malheureusement pas pour localhost.

53
Olaf

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

Si vous souhaitez contrôler la durée de la mise en cache, vous pouvez utiliser les en-têtes de réponse HTTP Cache-Control et Expires pour faire de même. Sinon, si vous ne souhaitez pas mettre en cache la réponse 301, utilisez les en-têtes suivants.

Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
22
Alex J

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

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

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 de développeur en 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

7
Rajesh Paul

Pour tester (pour éviter les redirections en cache), les utilisateurs peuvent ouvrir NEW PRIVATE WINDOW : cliquez sur CTRL+SHIFT+N[si vous utilisez Mozilla, utilisezP]

6
T.Todua

J'ai une solution simple qui a fonctionné sur tous les principaux navigateurs (dernière version), incluant 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 sites Web", "Cookies et données de sites 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
6
Dung Le

comme réponse de @thomasrutter 

Si vous avez déjà émis une redirection 301 mais que vous souhaitez annuler cette opération

Si les utilisateurs ont toujours la redirection 301 en cache dans leur navigateur, ils continueront d'être redirigés vers la page cible, que la redirection soit toujours en place ou non sur la page source. Vos options pour résoudre ce problème incluent:

La solution la plus simple et la meilleure consiste à émettre à nouveau une nouvelle redirection 301.

Le navigateur réalisera qu'il est redirigé vers ce qu'il pensait être auparavant une URL désaffectée, ce qui devrait entraîner une nouvelle extraction de cette URL pour confirmer que l'ancienne redirection n'existe pas encore.

Si vous n'avez pas le contrôle sur le site où la cible de redirection précédente est allée, vous avez plus de chance. Essayez de supplier le propriétaire du site de vous rediriger.

En fait, cela signifie:

  1. a.com 301 à b.com

  2. supprimer a.com 's 301 

  3. ajouter b.com 301 à a.com

Alors ça marche.

5
phil han

Pour résoudre le problème pour une adresse localhost, j'ai changé le numéro de port sous lequel le site était exécuté. Cela a fonctionné sur la version de Chrome 73.0.3683.86.

1
combatc2

Testez vos redirections en utilisant le mode incognito/InPrivate. Ainsi, lorsque vous fermez le navigateur, le contenu du cache est vidé et la réouverture de la fenêtre ne contient pas le cache.

1
yougotiger

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. Au moins ajouter des en-têtes de cache. Dans htaccess, je le fais toujours de cette façon avec maintenant la mise en cache:

<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>
0
yunzen