Pergunta

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

Foi útil?

Solução

Um etag é uma string arbitrária que o servidor envia ao cliente e que o cliente enviará de volta ao servidor na próxima vez que o arquivo for solicitado.

O etag deve ser computável no servidor com base no arquivo.Mais ou menos como uma soma de verificação, mas talvez você não queira fazer a soma de verificação de todos os arquivos que o enviam.

 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)

Criei uma string no formato "número do inode do arquivo/carimbo de data/tamanho do arquivo".Portanto, se um arquivo for alterado no servidor depois de ter sido entregue ao cliente, o etag recém-gerado não corresponderá se o cliente o solicitar novamente.

char *mketag(char *s, struct stat *sb)
{
    sprintf(s, "%d/%d/%d", sb->st_ino, sb->st_mtime, sb->st_size);
    return s;
}

Outras dicas

Contanto que mude sempre que a representação do recurso muda, a forma como você o produz depende inteiramente de você.

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

  1. não exige que você o recalcule em cada GET condicional e
  2. não muda se o conteúdo do recurso não mudou

Usar hashes de conteúdo pode fazer com que você falhe em primeiro lugar se não armazenar os hashes computados junto com os arquivos.

O uso de números de inode pode fazer com que você falhe no número 2 se você reorganizar seu sistema de arquivos ou servir conteúdo de vários servidores.

Um mecanismo que pode funcionar é usar algo totalmente dependente do conteúdo, como um hash SHA-1 ou uma string de versão, computada e armazenada uma vez sempre que o conteúdo do recurso for alterado.

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

Por padrão, tanto o Apache quanto o IIS incorporam dados na ETag, o que reduz drasticamente as chances de sucesso do teste de validade em sites com vários servidores.

...

Se você não estiver aproveitando o modelo de validação flexível fornecido pelas ETags, é melhor simplesmente remover a ETag por completo.

Como gerar o apache etag padrão no 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 por algo exatamente como o etag (o navegador pede um arquivo apenas se ele tiver sido alterado no servidor), nunca funcionou e acabei usando um truque GET (adicionando um carimbo de data / hora como argumento get aos arquivos js ).

Tenho usado o Adler-32 como encurtador de links HTML.Não tenho certeza se esta é uma boa ideia, mas até agora não notei nenhuma duplicata.Pode funcionar como um gerador de etag.E deveria ser mais rápido do que tentar fazer hash usando um esquema de criptografia como sha, mas não verifiquei isso.O código que uso é:

 shortlink = str(hex(zlib.adler32(link)+(2**32-1)/2))[2:-1]

Eu recomendaria não usá-los e, em vez disso, optar pelos cabeçalhos modificados pela última vez.

Askapache tem um artigo útil sobre isso.(já que eles fazem praticamente tudo o que parece!)

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

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