Configuração do PHP ETAG de maneira confiável
Pergunta
Estou tendo problemas para definir o ETAG no navegador de um usuário de maneira confiável. Quando um usuário clica em um dos meus links externos, gostaria de definir o ID do artigo em seu ETAG (também uso cookies, mas gostaria de experimentar o ETAG especificamente para testar sua confiabilidade).
Quando o mesmo usuário retornar ao meu site algumas horas/dias depois, gostaria de poder ler o valor ETAG e usá -lo para coisas.
Eu posso definir um ETAG no clique inicial, mas quando o usuário retorna, o valor ETAG desaparece. Eu presumo que ele expirou ou algo assim. Aqui está o código que tenho tentado:
<?
$time = 1280951171;
$lastmod = gmdate('D, d M Y H:i:s \G\M\T', $time);
$etag = '123';
$ifmod = isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] == $lastmod : null;
$iftag = isset($_SERVER['HTTP_IF_NONE_MATCH']) ? $_SERVER['HTTP_IF_NONE_MATCH'] == $etag : null;
if (($ifmod || $iftag) && ($ifmod !== false && $iftag !== false)) {
header('HTTP/1.0 304 Not Modified');
} else {
header("Last-Modified: $lastmod");
header("ETag: $etag");
}
print_r($_SERVER);
?>
Solução
Você deve envolver seu ETAG em cotações duplas (como mostra o Link que Codler mencionou):
'"' . $etag . '"'
Eu não acho que é provável que resolva seu problema, mas você provavelmente quer
header('Not Modified',true,304);
ao invés de
header('HTTP/1.0 304 Not Modified');
A partir de Php 5.4, há uma maneira melhor de fazer isso com http_response_code
:
http_response_code(304);
Além disso, você verificou os suspeitos habituais parando os cabeçalhos? Marcadores de ordem de bytes Unicode são muito irritantes com isso. (Desconsidere se você puder ver outros cabeçalhos que você está se preparando)
Outras dicas
ETAG não é tão confiávelhttp://developer.yahoo.com/performance/rules.html#etags