Quiero hacer un etag que coincida con lo que produce Apache. ¿Cómo crea Apache sus etags?¿Cómo se hace un etag que coincida con Apache?
Respuesta
Apache utiliza 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í está 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 genera dinámicamente su página, esto 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 lo que etag s son, se supone que son 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.
Este enfoque puede ser útil para cosas como descargar scripts que solo transmiten archivos a través de PHP y otras situaciones donde las respuestas no son realmente dinámicas por solicitud. –
Una cosa para recordar acerca de los Etags de Apache es que no funcionan bien en clusters porque incluyen información de inodo que puede, y probablemente variará, entre máquinas en el mismo clúster.
la respuesta anterior (de Chris) funciona bien, pero se puede simplificar utilizando una conversión implícita en el sprintf:
sprintf('"%x-%x-%x"', $s['ino'], $s['size'], str_pad($s['mtime'], 16, "0"));
El sugirió %016x
no funciona porque se aplica el relleno después de la conversión a hexadecimal , en lugar de antes
Esto no ** funciona **, no estoy seguro de por qué, tal vez porque% x necesita un 'int' como entrada? – Halcyon
@FritsvanCampen: resulta ser un poco más complicado que eso. 'sprintf' intentará convertir la cadena en' int', pero dado que estos números son tan grandes, se desbordan y causan problemas. La solución es usar 'float' en su lugar:' sprintf ('"% x-% x-% x"', $ s ['ino'], $ s ['size'], (float) str_pad ($ s [ 'mtime'], 16, '0')) '. –
- 1. en Sinatra, ¿cómo se hace un filtro "anterior" que coincida con todas las rutas excepto algunas
- 2. ¿Qué hace que la sustitución en Vim solo coincida con un elemento por línea?
- 3. Apache, LocationMatch: coincida con la cadena de consulta
- 4. ETag vs cabecera Expira
- 5. Regex para que coincida con palabras completas que comienzan con $
- 6. ¿Cómo se hace que un componente UIPickerView se ajuste?
- 7. Eliminar Etag de favicon.ico
- 8. Seleccionar un elemento que coincida con varias etiquetas
- 9. búsqueda de php (difusa) que coincida con
- 10. Regex para que coincida con Domain.CCTLD
- 11. expresiones regulares para que coincida con EOF
- 12. HTTP: Generando encabezado ETag
- 13. Buscar todos los nodos que tengan un atributo que coincida con un cierto valor con scala
- 14. ¿Cómo puedo encontrar elementos que contengan un atributo data- * que coincida con un prefijo usando jquery
- 15. "ansioso" expresión regular que coincida con
- 16. Cómo cambiar un repositorio git clonado con --bare para que coincida con uno clonado con --mirror?
- 17. Perl expresiones regulares para que coincida con un hash MD5?
- 18. Encontrar un elemento que coincida con el predicado en Scala
- 19. PHP expresión regular para que coincida con un div
- 20. Sintaxis para ETag?
- 21. Cómo probar los raíles ETag caching?
- 22. ¿Cómo se escribe un patrón de prueba de archivo mágico para que coincida con el final de un archivo?
- 23. Configuración de PHP Etag confiable
- 24. ¿Cómo cambiar la hora en el servidor apache para que coincida con la hora de la computadora (PHP)?
- 25. Regex: ¿cómo decir algo que NO coincida?
- 26. ¿Puedo evitar que el encabezado de Etag se emita en AWS Cloudfront?
- 27. WaitHandle.WaitAny para que coincida con la funcionalidad WaitForMultipleObjects
- 28. regex para que coincida con un solo carácter que sea cualquier cosa excepto un espacio
- 29. Listado de archivos en un directorio que coincida con un patrón en Java
- 30. ¿Cómo se hace comodín coincide con XSLT?
Por qué no 'header (sprintf ('Etag:"% x-% x-% 016x "', $ fs ['ino'], $ fs ['size'], $ fs ['mtime'])) ; '? –
Observé que la parte MTime del ETag de mi servidor Apache en realidad tiene un MTime mucho más preciso, también usa microsegundos. Entonces, si quieres generar el ETag exactamente como Apache lo hace, necesitarás la microtime del mtime. Que yo sepa, esto no es posible en PHP. Sin embargo, lo que puede hacer es verificar si el MTime de Apache es lo suficientemente cerrado (<1 segundo), por lo que al menos puede devolver un '304 no modificado'. – Halcyon