2010-08-12 10 views
6

im teniendo problemas para configurar el Etag en el navegador de un usuario de manera confiable. Cuando un usuario hace clic en uno de mis enlaces externos, me gustaría establecer el ID del artículo en su Etag (también uso cookies, pero me gustaría experimentar con Etag específicamente para probar su fiabilidad).Configuración de PHP Etag confiable

Cuando el mismo usuario regrese a mi sitio algunas horas/días después, me gustaría poder leer el valor de Etag y usarlo para cosas.

Puedo establecer un Etag en el clic inicial, pero cuando el usuario regresa el valor de Etag se ha ido. Supongo que ha expirado o algo así. Aquí está el código que he estado intentando:

<? 

$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); 

?> 

Respuesta

5

Usted debe embalar sus etag entre comillas dobles (como el enlace Codler mencionó shows):

'"' . $etag . '"' 

no creo que es probable que resolver su problema, pero es probable que quieren

header('Not Modified',true,304); 

en lugar de

header('HTTP/1.0 304 Not Modified'); 

A partir de PHP 5.4 hay una forma mejor de hacer esto con http_response_code:

http_response_code(304); 

Además, tiene usted marcó para los sospechosos habituales de parada cabeceras? Los marcadores de orden byte Unicode son muy molestos con esto. (Ignore si puede ver otros encabezados que se está configurando)

+0

cosas increíbles !! el "" es lo que me estaba perdiendo :-) ¡Gracias! –

+0

En realidad, la sintaxis 'header ('Not Modified', true, 304);' resultó en un "500 Internal Server Error" en mi web de Wordpress. La sintaxis original parece ser más segura. – Sphinxxx

+1

@Sphinxxx Lamentablemente, eso será incorrecto para la mayoría de los agentes de usuario web que usan HTTP/1.1 (por lo que recomendé que no se codifique). Actualicé la publicación para incluir una función 'nueva' en PHP 5.4 que es preferible a las demás. Intenta eso en su lugar. –

-3
+0

Enlace de interés, gracias - aunque solo usamos un servidor web, por lo que debería ser un plan de respaldo decente –

+3

Eso solo es cierto si los ETags se generan de ciertas maneras . "El problema con ETags es que * normalmente * se construyen utilizando atributos que los hacen únicos para un servidor específico que aloja un sitio". @PeterSmith está especificando sus propios ETags y puede evitar hacerlo fácilmente. –

+6

@Codler, los etags son confiables cuando los usas correctamente y no son confiables si los usaste incorrectamente. – Pacerier