Pergunta

Quero fazer um etag que corresponda ao que o Apache produz.Como o apache cria seus etags?

Foi útil?

Solução

O Apache usa o formato padrão inode-filesize-mtime.A única ressalva para isso é que o mtime deve ser o horário da época e preenchido com zeros, portanto tem 16 dígitos.Veja como fazer isso em PHP:

$fs = stat($file);
header("Etag: ".sprintf('"%x-%x-%s"', $fs['ino'], $fs['size'],base_convert(str_pad($fs['mtime'],16,"0"),10,16)));

Outras dicas

Uma coisa a lembrar sobre os Etags do Apache é que eles não funcionam bem em clusters porque incluem informações de inode que podem — e provavelmente irão — variar entre máquinas no mesmo cluster.

Porém, se você estiver gerando sua página dinamicamente, isso provavelmente não fará sentido.Se você estiver em PHP, poderá escolher o inode e o tamanho do arquivo do script principal, mas o tempo de modificação não informará se seus dados foram alterados.A menos que você tenha um bom processo de cache ou apenas gere páginas estáticas, as etags não são úteis.Se você tiver um bom processo de cache, o inode e o tamanho do arquivo provavelmente serão irrelevantes.

Editar:Para pessoas que não sabem o que etiquetas são - eles deveriam ser apenas um valor que muda quando o conteúdo é alterado, para fins de armazenamento em cache.O navegador obtém o etag do servidor web, compara-o ao etag para sua cópia em cache e, em seguida, busca a página inteira se o etag tiver sido alterado.

a resposta acima (de Chris) funciona bem, mas pode ser simplificada usando uma conversão implícita no sprintf:

sprintf('"%x-%x-%x"', $s['ino'], $s['size'], str_pad($s['mtime'], 16, "0"));

O sugerido %016x não funciona porque o preenchimento é aplicado após a conversão para hexadecimal, e não antes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top