Qual è l'algoritmo utilizzato per generare etags in Nginx? Sembrano qualcosa come "554b73dc-6f0d" ora.
Sono generati solo dal timestamp?
Qual è l'algoritmo utilizzato per generare etags in Nginx? Sembrano qualcosa come "554b73dc-6f0d" ora.
Sono generati solo dal timestamp?
Risposte:
Dal codice sorgente: 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 }
Nelle righe 1830 e 1831 puoi vedere che l'input è l'ultima ora modificata e la lunghezza del contenuto.
In PHP chi ne avrà bisogno.
$pathToFile = '/path/to/file.png';
$lastModified = filemtime($pathToFile);
$length = filesize($pathToFile);
header('ETag: "' . sprintf('%x-%x', $lastModified, $length) . '"');