food example control cache apache http etag

example - ¿Cómo se hace un etag que coincida con Apache?



etag header exploit (4)

Quiero hacer un etag que coincida con lo que Apache produce. ¿Cómo crea Apache sus etags?


Apache usa el formato estándar de inode-filesize-mtime. La única advertencia a esto es que el mtime debe ser un tiempo de época y rellenado con ceros, por lo que tiene 16 dígitos. Aquí es cómo hacerlo en PHP:

$fs = stat($file); header("Etag: ".sprintf(''"%x-%x-%s"'', $fs[''ino''], $fs[''size''],base_convert(str_pad($fs[''mtime''],16,"0"),10,16)));


Sin embargo, si generas dinámicamente tu página, probablemente no tenga sentido. Si está en PHP, puede elegir el inodo y el tamaño del archivo del script principal, pero el tiempo de modificación no le indicará si sus datos han cambiado. A menos que tenga un buen proceso de almacenamiento en caché o simplemente genere páginas estáticas, los etags no son útiles. Si tiene un buen proceso de almacenamiento en caché, el inodo y el tamaño del archivo probablemente sean irrelevantes.

Editar: para las personas que no saben qué son los etag , se supone que son solo un valor que cambia cuando el contenido ha cambiado, para fines de almacenamiento en caché. El navegador obtiene el etag del servidor web, lo compara con el etag para su copia en caché y luego recupera toda la página si el etag ha cambiado.


Una cosa para recordar acerca de los Etags de Apache es que no funcionan bien en los clusters porque incluyen información de inode que puede, y probablemente variará, entre máquinas en el mismo clúster.


la respuesta anterior (de Chris) funciona bien, pero se puede simplificar usando un molde implícito en el sprintf:

sprintf(''"%x-%x-%x"'', $s[''ino''], $s[''size''], str_pad($s[''mtime''], 16, "0"));

El %016x sugerido no funciona porque el relleno se aplica después de la conversión a hexadecimal, en lugar de antes.