it-swarm-pt.tech

Desativar cache para algumas imagens

Eu gero algumas imagens usando um PHP lib.

Às vezes, o navegador não carrega o novo arquivo gerado. 

Como posso desativar o cache apenas para imagens criadas dinamicamente por mim?

Nota: Eu tenho que usar o mesmo nome para as imagens criadas ao longo do tempo.

88
dole doug

Uma solução comum e simples para esse problema que parece um hack, mas é bastante portátil, é adicionar uma string de consulta gerada aleatoriamente a cada solicitação para a imagem dinâmica.

Então, por exemplo -

<img src="image.png" />

Se tornaria

<img src="image.png?dummy=8484744" />

Ou

<img src="image.png?dummy=371662" />

Do ponto de vista do servidor da web, o mesmo arquivo é acessado, mas, do ponto de vista do navegador, nenhum cache pode ser executado.

A geração de números aleatórios pode acontecer no servidor ao veicular a página (apenas certifique-se de que a própria página não esteja armazenada em cache ...) ou no cliente (usando JavaScript).

Você precisará verificar se o seu servidor web pode lidar com esse truque.

189
Hexagon

As estratégias de armazenamento em cache do navegador podem ser controladas pelos cabeçalhos HTTP. Lembre-se que eles são apenas uma dica, na verdade. Como os navegadores são terrivelmente inconsistentes neste (e em qualquer outro) campo, você precisará de vários cabeçalhos para obter o efeito desejado em vários navegadores.

header ("Pragma-directive: no-cache");
header ("Cache-directive: no-cache");
header ("Cache-control: no-cache");
header ("Pragma: no-cache");
header ("Expires: 0");
35
lhunath

Se você precisa fazer isso dinamicamente no navegador usando javascript, aqui está um exemplo ...

<img id=graph alt="" 
  src="http://www.kitco.com/images/live/gold.gif" 
  />

<script language="javascript" type="text/javascript">
    var d = new Date(); 
    document.getElementById("graph").src = 
      "http://www.kitco.com/images/live/gold.gif?ver=" + 
       d.getTime();
</script>
10
Anton Swanevelder

Eu verifiquei todas as respostas e o melhor parecia ser (o que não é):

<img src="image.png?cache=none">

no início.

No entanto, se você adicionar cache = none parameter (que é estático "none" Word), ele não afeta nada, o navegador ainda é carregado a partir do cache.

Solução para este problema foi:

<img src="image.png?nocache=<?php echo time(); ?>">

onde você basicamente adiciona unest timestamp para tornar o parâmetro dinâmico e sem cache, funcionou.

No entanto, meu problema era um pouco diferente: Eu estava carregando na imagem do gráfico php gerado e controlando a página com parâmetros $ _GET. Eu queria que a imagem fosse lida do cache quando o parâmetro URL GET permanecesse o mesmo e não fizesse cache quando os parâmetros GET mudassem.

Para resolver este problema, eu precisava do hash $ _GET, mas como é array aqui está a solução:

$chart_hash = md5(implode('-', $_GET));
echo "<img src='/images/mychart.png?hash=$chart_hash'>";

Editar :

Embora a solução acima funcione muito bem, às vezes você quer servir a versão em cache até que o arquivo seja alterado. (com a solução acima, ele desabilita o cache para aquela imagem completamente) Então, para servir a imagem em cache do navegador ATÉ que haja uma mudança no arquivo de imagem use:

echo "<img src='/images/mychart.png?hash=" . filemtime('mychart.png') . "'>";

filemtime () obtém o tempo de modificação do arquivo.

9
Tarik

Eu sei que este tópico é antigo, mas está bem no Google. Descobri que colocar isso no seu cabeçalho funciona bem;

<meta Http-Equiv="Cache-Control" Content="no-cache">
<meta Http-Equiv="Pragma" Content="no-cache">
<meta Http-Equiv="Expires" Content="0">
<meta Http-Equiv="Pragma-directive: no-cache">
<meta Http-Equiv="Cache-directive: no-cache">
3
Dimitri Visser

Alterar a fonte da imagem é a solução. Você pode realmente fazer isso adicionando um carimbo de data/hora ou um número aleatório à imagem. 

Melhor seria adicionar uma soma de verificação, por exemplo, dos dados que a imagem representa. Isso permite o armazenamento em cache quando possível.

3
Stefan van Gastel

Eu estava apenas procurando uma solução para isso, e as respostas acima não funcionaram no meu caso (e eu não tenho reputação suficiente para comentar sobre elas). Acontece que, pelo menos para o meu caso de uso e o navegador que eu estava usando (Chrome no OSX), a única coisa que parecia impedir o armazenamento em cache era:

Cache-Control = 'no-store'

Para completar, agora estou usando todos os 3 de 'no-cache, no-store, must-revalidate'

Então, no meu caso (servindo imagens geradas dinamicamente fora do Flask em Python), eu tive que fazer o seguinte para trabalhar no maior número possível de navegadores ...

def make_uncached_response(inFile):
    response = make_response(inFile)
    response.headers['Pragma-Directive'] = 'no-cache'
    response.headers['Cache-Directive'] = 'no-cache'
    response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
    response.headers['Pragma'] = 'no-cache'
    response.headers['Expires'] = '0'
    return response
2
Mark

eu tive esse problema e superar assim. 

var newtags='<div class="addedimage"><h5>preview image</h5><img src="'+one+'?nocache='+Math.floor(Math.random() * 1000)+'"></div>';
1
Jordan Georgiadis

Eu usei isso para resolver meu problema semelhante ... exibindo um contador de imagens (de um provedor externo). Não atualizou sempre corretamente. E depois que um parâmetro aleatório foi adicionado, tudo funciona bem :)

Eu adicionei uma string de data para garantir a atualização pelo menos a cada minuto.

código de amostra (PHP):

$output .= "<img src=\"http://xy.somecounter.com/?id=1234567890&".date(ymdHi)."\" alt=\"somecounter.com\" style=\"border:none;\">";

Isso resulta em um link src como:

http://xy.somecounter.com/?id=1234567890&1207241014
0
Pinoccio

Vamos adicionar outra solução ao grupo.

Adicionar uma string única no final é uma solução perfeita. 

example.jpg?646413154

A solução a seguir estende esse método e fornece o recurso de armazenamento em cache e obtém uma nova versão quando a imagem é atualizada.

Quando a imagem é atualizada, o filemtime será alterado.

<?php
$filename = "path/to/images/example.jpg";
$filemtime = filemtime($filename);
?>

Agora imprima a imagem:

<img src="images/example.jpg?<?php echo $filemtime; ?>" >
0
Daniel

Se você tiver um URL de imagem codificado, por exemplo: http://example.com/image.jpg , você pode usar o php para adicionar cabeçalhos à sua imagem.

Primeiro você terá que fazer o Apache processar seu jpg como php. Veja aqui: É possível executar PHP com extensão file.php.jpg?

Carregue a imagem (imagecreatefromjpeg) do arquivo e adicione os cabeçalhos das respostas anteriores. Use o cabeçalho da função php para adicionar os cabeçalhos. 

Em seguida, imprima a imagem com a função imagejpeg.

Por favor note que é muito inseguro deixar o php processar imagens jpg. Também, por favor, esteja ciente de que eu não testei esta solução, então cabe a você fazê-la funcionar.

0
Sam Sam