HTTP: Generating ETag cabeçalho

votos
24

Como faço para gerar um cabeçalho HTTP ETag para um arquivo de recurso?

Publicado 07/08/2008 em 09:45
fonte usuário
Em outras línguas...                            


6 respostas

votos
17

Enquanto isso muda sempre que a representação do recurso muda, como você produz é completamente até você.

Você deve tentar produzi-lo de uma forma que, adicionalmente:

  1. não exige que você para voltar a calcular-lo em cada GET condicional, e
  2. não muda se o conteúdo do recurso não mudou

Usando hashes de conteúdo pode causar-lhe a falhar em # 1 se você não armazenar os hashes computados junto com os arquivos.

Utilizando números de inode pode causar-lhe a falhar em # 2 se você reorganizar seu sistema de arquivos ou você servir conteúdo de vários servidores.

Um mecanismo que pode funcionar é usar algo inteiramente dependente do conteúdo, como um hash SHA-1 ou uma cadeia de versão, calculado e armazenado uma vez sempre que seus recursos de conteúdo mudanças.

Respondeu 09/08/2008 em 14:50
fonte usuário

votos
16

Um etag é uma cadeia arbitrária que o servidor envia para o cliente que o cliente irá enviar de volta para o servidor na próxima vez que o arquivo é solicitado.

O etag deve ser computável no servidor com base no arquivo. Como uma espécie de soma de verificação, mas você não pode querer soma de verificação de cada arquivo de enviá-lo.

 server                client

        <------------- request file foo

 file foo etag: "xyz"  -------->

        <------------- request file foo
                       etag: "xyz" (what the server just sent)

 (the etag is the same, so the server can send a 304)

I construiu uma string no formato "tamanho número do arquivo inode / datestamp / arquivo". Assim, se um arquivo for alterado no servidor depois de ter sido servido para o cliente, o etag recém-regenerado não corresponder se o cliente re-solicitar.

char * mketag (char * s, struct sb Stat *)
{
    sprintf (s, "d% /% d /% d", SB> st_ino, SB> st_mtime, SB> st_size);
    retornar s;
}
Respondeu 07/08/2008 em 09:57
fonte usuário

votos
6

De http://developer.yahoo.com/performance/rules.html#etags :

Por padrão, ambos Apache e IIS incorporar dados no ETag que reduz drasticamente as chances do teste de validade sucedendo em web sites com múltiplos servidores.

...

Se você não está aproveitando o modelo de validação flexível que ETags fornecer, é melhor apenas para remover o ETag completamente.

Respondeu 07/08/2008 em 11:13
fonte usuário

votos
2

Como gerar o etag apache padrão em bash

for file in *; do printf "%x-%x-%x\t$file\n" `stat -c%i $file` `stat -c%s $file` $((`stat -c%Y $file`*1000000)) ; done

Mesmo quando eu estava procurando algo exatamente como o etag (o navegador pede um arquivo somente se tiver alterado no servidor), nunca funcionou e acabei usando um truque GET (adicionando um timestamp como um argumento de chegar ao js ).

Respondeu 05/09/2011 em 13:38
fonte usuário

votos
1

Ive usando Adler-32 como um link HTML encurtador. Im não tem certeza se isso é uma boa idéia, mas até agora, Eu ainda não notou qualquer duplicatas. Ele pode funcionar como um gerador etag. E deve ser mais rápido, em seguida, tentando botar usando um esquema de criptografia como sha, mas eu havent verificado isso. O código que eu uso é:

 shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]
Respondeu 27/12/2012 em 16:58
fonte usuário

votos
0

Eu não recomendo usá-los e ir para o último modificado cabeçalhos vez.

Askapache tem um artigo útil sobre este assunto. (Como fazem praticamente tudo que parece!)

http://www.askapache.com/htaccess/apache-speed-etags.html

Respondeu 19/09/2008 em 23:31
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more