1001Ferramentas
🏷️Dev

ETag Weak vs Strong

Classifica um ETag como weak (W/"...") ou strong. Weak é igualdade semântica, strong é byte-a-byte.

Tipo

O que aquele W/ na frente do ETag significa

Você está atrás de um 304 que não acontece, ou que acontece quando não devia, e reparou que alguns ETags vêm como "a1b2c3" e outros como W/"a1b2c3". A diferença não é cosmética: ela decide quais requisições condicionais o servidor consegue atender. Cole o valor que veio no cabeçalho e a página diz se aquele ETag é forte ou fraco, ou se o formato está fora do padrão.

A regra vem do RFC 9110. O ETag é uma sequência entre aspas duplas, opcionalmente precedida de W/ com W maiúsculo, e esse prefixo é sensível a maiúscula. Forte quer dizer igualdade byte a byte. Fraco quer dizer que o recurso é semanticamente o mesmo, ainda que os bytes tenham mudado. É por isso que camadas de compressão costumam rebaixar um ETag forte para fraco: o conteúdo continua igual, a representação não.

A consequência prática aparece nas condicionais. If-None-Match, o caso do 304 comum, usa comparação fraca e aceita os dois tipos. Já If-Range e If-Match exigem comparação forte, então com ETag fraco o download parcial recomeça do zero em vez de continuar de onde parou. Se você calcula o ETag pelo hash do corpo enviado, use forte; se calcula pela versão do registro no banco, fraco é mais sincero. A classificação olha só o texto colado, sem buscar a URL.

Perguntas frequentes

Posso escrever w/ com w minúsculo?
Não. O RFC 9110 define o indicador fraco como W maiúsculo seguido de barra. Em minúsculo o valor deixa de ser um entity-tag válido e a página o marca como formato inválido.
Faz sentido mandar ETag e Last-Modified na mesma resposta?
Sim, e é comum. O cliente pode enviar If-None-Match e If-Modified-Since juntos; quando os dois estão presentes, o servidor decide pelo ETag, que é mais preciso.
A ferramenta calcula o ETag do meu arquivo?
Não. Ela classifica um valor que você já tem em mãos. Gerar o ETag é responsabilidade do servidor, normalmente por hash do corpo ou por versão do recurso.

Ferramentas Relacionadas