Por quanto tempo os navegadores armazenam em cache o HTTP 301s?

381

Estou depurando um problema com um redirecionamento permanente HTTP 301. Após um teste rápido, parece que o Safari limpa seu cache de 301s quando é reiniciado, mas o Firefox não.

Quando o IE, Chrome, Firefox e Safari limpam o cache de 301s?

ATUALIZAÇÃO: Por exemplo, se eu quiser redirecionar example1.compara example2.com, mas acidentalmente o defino para redirecionar para example3.com, isso é um problema. Posso corrigir o erro, mas quem já visitou example1.como cache de redirecionamentos incorretos em cache e example3.com, portanto, não poderá acessar example1.comou example2.comaté que seu cache seja limpo. Após a investigação, acho que não havia Cache-Controle Expirescabeçalhos definidos. Os cabeçalhos da resposta 301 incorreta teriam sido assim:

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

Meus próprios testes mostram que:

  • IE7, IE8, Android 2.3.4 não fazem cache de todo.
  • Firefox 18.0.2, Safari 5.1.7 (no Windows 7) e Opera 12.14 todos armazenam em cache e limpe o cache na reinicialização do navegador.
  • IE10 e Chrome 25, mas não são limpos na reinicialização do navegador; portanto , quando eles serão limpos?
Liam
fonte
7
Por favor, diga ao chrome que precisamos de uma maneira de sair deste buraco infernal 301: bugs.chromium.org/p/chromium/issues/…
BT
@BT Como o problema afeta todos os navegadores, na verdade apenas a IETF poderia corrigir isso, provavelmente definindo algum tempo limite obrigatório nos 301s armazenados em cache que não possuem TTL, para que os navegadores voltassem a verificar suas suposições armazenadas em cache.
McGuireV10
11
Iniciei uma discussão na lista de discussão da IETF sobre isso, se alguém que ainda está acompanhando esse problema quiser pesar: lists.w3.org/Archives/Public/ietf-http-wg/2017OctDec/0363.html
McGuireV10

Respostas:

300

Pelo menos dois navegadores - Chrome e Firefox - armazenarão em cache um redirecionamento 301 sem data de validade .

Ou seja, ele permanecerá em cache enquanto o cache do navegador puder acomodá-lo. Ele será removido do cache se você limpá-lo manualmente ou se as entradas do cache forem limpas para liberar espaço para novas.

Você pode verificar isso pelo menos no Firefox, indo about:cachee localizando-o no cache do disco.

Não sei o comportamento de outros navegadores, como o IE10 / IE11. No entanto, considerando que outros navegadores o armazenam em cache indefinidamente, você precisará acomodar isso de qualquer maneira.

Em todos os navegadores, incluindo o Chrome / Firefox, ainda é possível substituir esse comportamento padrão usando cabeçalhos, conforme descrito abaixo:

Nota: esta resposta foi escrita em 2014 e o comportamento do navegador pode mudar com o tempo.

Se você não deseja que o redirecionamento seja armazenado em cache

Esse cache indefinido é apenas o cache padrão desses navegadores na ausência de cabeçalhos de controle de cache. A lógica é que você está especificando um redirecionamento "permanente" e não fornecendo outras instruções de armazenamento em cache, para tratá-lo como se você quisesse que ele fosse armazenado em cache indefinidamente.

Os navegadores ainda respeitam os cabeçalhos de controle de cache e expira como com qualquer outra resposta, se eles forem especificados.

Você pode adicionar cabeçalhos como Cache-Control: max-age=3600ou Expires: Thu, 01 Dec 2014 16:00:00 GMTaos seus redirecionamentos 301. Você pode até adicionar Cache-Control: no-cachepara que ele não seja armazenado em cache permanentemente pelo navegador ou Cache-Control: no-storepara que ele não possa ser armazenado em armazenamento temporário pelo navegador.

Uma alternativa melhor na minha opinião, no entanto, é usar um redirecionamento 302 ou 307. Isso não implica que os navegadores ou caches sejam redirecionamentos "permanentes" e, portanto, não devem ser armazenados em cache na ausência de cabeçalhos de controle de cache.

Para mim, parece que emitir um redirecionamento 301, mas marcá-lo como não armazenável em cache está indo contra o espírito do que é um redirecionamento 301, mesmo que seja tecnicamente válido. YMMV, e você pode encontrar casos extremos onde faz sentido que um redirecionamento "permanente" tenha um limite de tempo.

Se você emitiu anteriormente um redirecionamento 301, mas deseja cancelar a execução

Se as pessoas ainda tiverem o redirecionamento 301 em cache no navegador, elas continuarão sendo direcionadas para a página de destino, independentemente de a página de origem ainda ter o redirecionamento no lugar. Suas opções para corrigir isso incluem:

  • A solução mais simples e melhor é emitir outro redirecionamento 301 novamente.

    O navegador perceberá que está sendo direcionado de volta para o que anteriormente pensava ser um URL desativado, e isso deve fazer com que o URL seja buscado novamente novamente para confirmar que o redirecionamento antigo ainda não está lá.

    Edit: alguns comentários lançam dúvidas sobre isso, veja abaixo.

  • Se você não tiver controle sobre o site para onde foi o destino de redirecionamento anterior, estará sem sorte. Tente e implore ao proprietário do site para redirecionar de volta para você.

Também prevenir é melhor do que remediar - evite um redirecionamento 301 se não tiver certeza de que deseja desativar permanentemente o URL antigo.

thomasrutter
fonte
18
Além disso, você tem alguma referência que mostre que os navegadores manipulam redirecionamentos permanentes circulares buscando novamente o URL original?
Kevin Christopher Henry
7
301 redirecionamento de volta don`t trabalho, navegador ainda armazenar em cache antigo redirecionamento 301 e vejo loop infinito
Yuriy Kolodovskyy
5
como eu fiz teste: há algum tempo atrás eu fiz redirecionamento 301 para http://www.SOMEHOST.coma https://www.SOMEHOST.com. Mas agora http://www.SOMEHOST.comdeve ser o host principal do site. Então, redirecione de https para http removido. Como você mostra, fiz redirecionamento 301 de https://www.SOMEHOST.compara http://www.SOMEHOST.com, mas veja loop. Navegador não re-buscar ...
Yuriy Kolodovskyy
8
Confirmo que o redirecionamento de volta (com um redirecionamento de PHP no meu caso) funciona perfeitamente no Google Chrome, desde que (obviamente) você tenha removido o redirecionamento 301 inicial.
Vincent Poirier 14/03
15
Posso confirmar que o redirecionamento de volta funciona perfeitamente bem. Os navegadores que vêem o loop de redirecionamento invalidam as entradas de cache. Testado no IE11, Firefox 52, Safari 10, Chrome 57.
Munhitsu 04/04
258

Do Chrome 71

Para limpar um redirecionamento permanente, acesse chrome: // settings / clearBrowserData e, a partir daí, apenas a limpeza de "imagens e arquivos em cache" limpou o redirecionamento.

Chrome 48-70

Vá para chrome: // net-internals. À direita da barra de status vermelha superior, clique na seta para baixo ▼ para abrir o menu suspenso e, no grupo "Ferramentas", escolha "Limpar cache".

A partir da versão 48, essa era a única coisa que funcionava para limpar um 301 em cache.

McGuireV10
fonte
14
A partir da versão 54 do Chrome, infelizmente isso não está funcionando para mim.
Pwagner
4
Pensando bem, realmente não respondi à pergunta real : "Por quanto tempo os navegadores armazenam em cache um 301", e minha resposta não ajudaria ninguém que redirecionasse um site público onde você provavelmente precisará de uma maneira de desfazer permanentemente um 301 sem saber quantos navegadores em cache armazenaram em cache o redirecionamento - outras respostas abordam parcialmente esse cenário. Minha resposta é realmente útil apenas para desenvolvedores ou cenários da intranet onde você pode se comunicar com todos os usuários afetados.
precisa saber é o seguinte
11
Funciona na versão 68.0.3440.106 do Chrome (versão oficial)
Thum Choon Tat
12
chrome: // net-internals foi destruído no Chrome 71. A seção suspensa / Ferramentas foi removida. Há um botão DNS> Cache do resolvedor de host> Limpar cache do host, mas isso não funciona para remover os 301s armazenados em cache.
t-jam
52
No Chrome 71, chrome: // settings / clearBrowserData e, a partir daí, apenas a limpeza de "imagens e arquivos em cache" limpa o redirecionamento.
Bemmu 13/01/19
179

Uma resposta que ajuda aqueles que desejam desesperadamente se livrar do cache de redirecionamento:

O Chrome armazena em cache o redirecionamento 301 infinitamente (no cache do disco local). Para limpar esse cache:

  • abra seu DevTools (pressione F12)
  • na Rede de guia verificar o "Desativar cache" checkbox
  • mantenha o DevTools aberto e recarregue a página (pressione F5)

Quando tudo estiver correto, você pode desmarcar a opção "Desativar cache" e tudo continuará funcionando conforme o esperado.

Olaf
fonte
14
Isso funciona e mesmo após a reativação do cache, o redirecionamento se foi. VALEU!
migg 20/09/16
2
Parece que isso não está funcionando para domínios apontados para 127.0.0.1 por meio do arquivo de hosts locais. Existe alguma outra opção para este caso?
Pwagner
Não funciona se o redirecionamento, sem querer, aponta para outra porta, como de localhost:8000para localhost(porta 80). Também limpei todos os dados do site / aplicativo do localhost e localhost: 8000, mas isso também não ajudou.
Dennis98
3
Esta solução funciona no Chrome a partir de 16 de novembro de 2019, versão 78.0.3904.97. As outras soluções não estão mais disponíveis. Depois de fazê-lo funcionar, você pode fechar as ferramentas do desenvolvedor e ele continuará funcionando corretamente.
Peter Wooster
Resposta aceita.
Aysennoussi 24/03
43

Faça o usuário enviar um formulário de postagem nesse URL e o redirecionamento em cache desaparecerá :)

<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
fonte
2
Concordo que este é o melhor método que encontrei para desaparafusá-lo.
Esjay
Ao contrário de outras respostas, esse método é adequado para resolver o problema de outras pessoas sem abrir o console do desenvolvedor! obrigado
Alexey Rytikov 12/03/19
4
fetch ('URL', {method: 'POST'}) deve fazer o truque da mesma maneira. Obrigado! Isso me salvou de dor de cabeça!
Calvin
Não acredito que essa é a única maneira que funcionou para mim (tentei todos os outros métodos primeiro - até o console fetch () falhou devido a uma política de segurança entre sites).
user36388
24

301é uma resposta armazenável em cache por RFC HTTP e os navegadores o armazenam em cache, dependendo dos cabeçalhos de cache HTTP que você possui na resposta. Use o FireBug ou Charles para examinar os cabeçalhos de resposta para saber a duração exata pela qual a resposta será armazenada em cache.

Se você deseja controlar a duração do armazenamento em cache, pode usar os cabeçalhos de resposta HTTP Cache-Controle Expiresfazer o mesmo. Como alternativa, se você não deseja armazenar em cache a 301resposta, use os seguintes cabeçalhos.

Cache-Control: no-store, no-cache, must-revalidate
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Alex J
fonte
12
Embora tecnicamente correta, sua resposta não responde à pergunta dos usuários e, portanto, não responde à pergunta pela qual vim aqui. Quando os 301s existentes, com cabeçalho des-cache já existentes no navegador expiram para os principais navegadores?
rob
Se alguém ainda está interessado, este link instruções pode alternar o cache para 301.
Francisco Presencia
O link é para FF e não funcionou para mim. Instalada extensão Web Developer 1.2.5 e usando FF 23.0.1
An Phu
a pergunta não foi respondida. A questão foi, quanto tempo o redirecionamento ser armazenados em cache para se nenhuma data de expiração foi especificado
Dennis Flagg
21

Existe uma maneira muito simples de remover o cache do navegador para redirecionamentos http, por exemplo, 301, 307 etc.

Você pode abrir o painel de rede no console do desenvolvedor no chrome. Selecione a chamada de rede. Clique com o botão direito do mouse e, em seguida, clique em Limpar cache do navegador para remover o redirecionamento em cache.

menu de contexto de chamada de rede

Rajesh Paul
fonte
11
Muito obrigado! Solução simples e funcionou! Desta forma, também deve funcionar no futuro.
precisa saber é
16

Confirmado!! faça o usuário enviar uma solicitação de postagem para o URL afetado e o redirecionamento em cache será esquecido.

Uma vitória rápida seria inseri-la no console do navegador se você puder:

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

Útil se você conhece o navegador afetado (especialmente durante o desenvolvimento).

Como alternativa , se você tiver acesso à página de redirecionamento 301 anterior, poderá adicionar esse script à página e sempre que for visitada, o 301 em cache será esquecido.

Emeke Ajeh
fonte
Isso é semelhante ao formulário de postagem acima, mas é menos esforço.
jpswade
Isso é correto @jpswade
Emeke Ajeh
12

Vou postar uma resposta que me ajudou:

vá para o URL:

chrome://settings/clearBrowserData

deve chamar pop-up e depois ..

  • selecionar apenas: cached images and files.
  • selecione a caixa de tempo: from beginning
John Tribe
fonte
Trabalhando no Chrome 79!
Webaholik
Trabalhando no Chrome 80, obrigado!
Joseph
6

como resposta de @thomasrutter

Se você emitiu anteriormente um redirecionamento 301, mas deseja cancelar a execução

Se as pessoas ainda tiverem o redirecionamento 301 em cache no navegador, elas continuarão sendo direcionadas para a página de destino, independentemente de a página de origem ainda ter o redirecionamento no lugar. Suas opções para corrigir isso incluem:

A solução mais simples e melhor é emitir outro redirecionamento 301 novamente.

O navegador perceberá que está sendo direcionado de volta para o que anteriormente pensava ser um URL desativado, e isso deve fazer com que o URL seja buscado novamente novamente para confirmar que o redirecionamento antigo ainda não está lá.

Se você não tiver controle sobre o site para onde foi o destino de redirecionamento anterior, estará sem sorte. Tente e implore ao proprietário do site para redirecionar de volta para você.

De fato, isso significa:

  1. a.com 301 para b.com

  2. excluir 301 de a.com

  3. adicione b.com 301 a a.com

Então funciona.

phil han
fonte
2
Mas você ainda tem o 301 do b.com: (- uma solução suja
BT
11
Você pode limpar um redirecionamento emitindo outro 301 de uma página diferente ? por exemplo ( a.com301 -> b.com) (excluir a.com301) (adicione a.com/abcdefg301 -> a.com) e forçar o cliente a visualizar de a.com/abcdefgalguma forma?
595 nemec
Obrigado, funciona! Testado no IE11, Firefox 52, Safari 10, Chrome 57
Munhitsu 04/04
Eu tive uma situação em que queria usar o a.com e o b.com. Portanto, b.com 301 a.com não era uma opção. Nossa solução foi mudar para HTTPS - nós não tinha redirecionamentos sobre HTTPS
rosell.dk
6

Eu tenho uma solução simples que funcionou em todos os principais navegadores (versão mais recente), inclui IE, Chrome e FF

  1. Ctrl + Shift + Del
  2. -
    1. Chrome: selecione "Histórico de navegação" e "Cache ..."
    2. IE: Deixo a opção padrão "Arquivos temporários da Internet e arquivos de sites", "Cookies e dados do site", "Histórico"
    3. FF: "Histórico de navegação e download", "Cache"
  3. Clique em "Excluir"
  4. Feche e reabra o seu navegador. Deveria funcionar
Dung Le
fonte
Você também deve ter certeza de que não está na página em questão, porque alguns navegadores não limpam itens em cache das páginas abertas.
Oliver Schimmer
6

Para fins de teste (para evitar redirecionamentos em cache), as pessoas podem abrir a NOVA JANELA PRIVADA : clique em CTRL+SHIFT+N[se você usa o Mozilla, use P]

T.Todua
fonte
Isso foi rebaixado, provavelmente porque a principal promessa da "janela privada" não é ESCREVER nos caches, mas ainda pode LER / REUTILIZÁ-los. MAS, para mim, no Firefox 37.0.1 (Linux), isso funcionou e foi muito rápido e útil. A janela privada está refletindo as configurações atuais / não armazenadas em cache do servidor da Web, enquanto as guias normais do navegador usam um redirecionamento 301 em cache.
alfonx
alfonx: a janela privada pode não reutilizar o cache simplesmente porque o proprietário do servidor pode usar os elementos de forma a cookie, revelando a identidade anterior do usuário. Embora eu deva admitir que a reutilização do cache provavelmente é segura contra uma esposa que odeia pornografia.
Zdenek
6
Isso não funciona se você já possui um 301 em cache. Privado realmente usará o redirecionamento que está em cache.
jeffmcneill
1

Teste seus redirecionamentos usando o modo de navegação anônima / InPrivate; assim, quando você fechar o navegador, ele liberará esse cache e a reabertura da janela não conterá o cache.

yougotiger
fonte
1

Como as outras respostas mostram. O cache pode estar indefinidamente no navegador. Isso é extremamente perigoso. Então não faça isso. Pelo menos adicione cabeçalhos de cache. No htaccess, eu sempre faço desta maneira com o cache agora:

<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
fonte
1

Para resolver o problema de um endereço de host local, alterei o número da porta em que o site era executado. Isso funcionou na versão 73.0.3683.86 do Chrome.

combatc2
fonte
-1

Na versão 79 do Google Chrome mais recente, você pode usar o chrome: // net-internals, selecionar DNS no painel esquerdo e tocar no botão Limpar cache do host

Captura de tela do chrome abrindo a página net-internals

Mohammad Ersan
fonte
Não sei por que isso está sendo rebaixado, o HTTP 301 é um problema relacionado ao cache do host DNS
Mohammad Ersan