Algoritmo detrás de la generación nginx etag

17

¿Cuál es el algoritmo utilizado para generar etags en Nginx? Se ven algo así como "554b73dc-6f0d" ahora.

¿Se generan solo a partir de la marca de tiempo?

Vladislav Rastrusny
fuente
1
No creo que contengan un inodo (a diferencia de Apache por defecto) ... aunque me cuesta encontrar dónde lo encontré hace mucho tiempo (mejor para un clúster de caché). ¿Está trabajando en un entorno sin un reloj útil (por ejemplo, incrustado)?
Cameron Kerr
1
Hay información relacionada en developer.yahoo.com/performance/rules.html#etags (pero no con respecto a Nginx)
Cameron Kerr

Respuestas:

32

Del código fuente: http://lxr.nginx.org/ident?_i=ngx_http_set_etag

1803 ngx_int_t
1804 ngx_http_set_etag(ngx_http_request_t *r)
1805 {
1806     ngx_table_elt_t           *etag;
1807     ngx_http_core_loc_conf_t  *clcf;
1808 
1809     clcf = ngx_http_get_module_loc_conf(r, ngx_http_core_module);
1810 
1811     if (!clcf->etag) {
1812         return NGX_OK;
1813     }
1814 
1815     etag = ngx_list_push(&r->headers_out.headers);
1816     if (etag == NULL) {
1817         return NGX_ERROR;
1818     }
1819 
1820     etag->hash = 1;
1821     ngx_str_set(&etag->key, "ETag");
1822 
1823     etag->value.data = ngx_pnalloc(r->pool, NGX_OFF_T_LEN + NGX_TIME_T_LEN + 3);
1824     if (etag->value.data == NULL) {
1825         etag->hash = 0;
1826         return NGX_ERROR;
1827     }
1828 
1829     etag->value.len = ngx_sprintf(etag->value.data, "\"%xT-%xO\"",
1830                                   r->headers_out.last_modified_time,
1831                                   r->headers_out.content_length_n)
1832                       - etag->value.data;
1833 
1834     r->headers_out.etag = etag;
1835 
1836     return NGX_OK;
1837 }

Puede ver en las líneas 1830 y 1831 que la entrada es la última hora modificada y la longitud del contenido.

Cameron Kerr
fuente
Compare con Apache ETags , que también se calculan a partir del tiempo y el tamaño de la modificación, pero también se pueden configurar para depender del inodo del archivo.
Raedwald
1

En PHP quién lo necesitará.

$pathToFile = '/path/to/file.png';

$lastModified = filemtime($pathToFile);
$length = filesize($pathToFile);

header('ETag: "' . sprintf('%x-%x', $lastModified, $length) . '"');
Max_Payne
fuente
3
¿Cómo es esto mejor que la respuesta aceptada?
RalfFriedl
1
@RalfFriedl esta respuesta será mejor para los programadores de PHP, porque en el futuro algún programador de PHP como yo buscará 3 palabras clave "nginx", "etag", "alg" y encontrará mi respuesta. Esto quizás evitará la creación de duplicación de preguntas.
Max_Payne