Algorithmus hinter der Nginx-Etag-Erzeugung

17

Mit welchem ​​Algorithmus werden in Nginx Etags generiert? Sie sehen jetzt ungefähr so ​​aus wie "554b73dc-6f0d".

Werden sie nur aus einem Zeitstempel generiert?

Vladislav Rastrusny
quelle
1
Ich glaube nicht, dass sie eine Inode enthalten (im Gegensatz zu Apache standardmäßig) ... obwohl ich Schwierigkeiten habe, herauszufinden, wo ich das vor langer Zeit gefunden habe (besser für einen Cache-Cluster). Arbeiten Sie in einer Umgebung ohne nützliche Uhr (z. B. eingebettet)?
Cameron Kerr
1
Es gibt einige verwandte Informationen in developer.yahoo.com/performance/rules.html#etags (aber nicht in Bezug auf Nginx)
Cameron Kerr

Antworten:

32

Aus dem Quellcode: 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 }

Sie können in den Zeilen 1830 und 1831 sehen, dass die Eingabe die letzte Änderungszeit und die Inhaltslänge ist.

Cameron Kerr
quelle
Vergleichen Sie mit Apache ETags , die ebenfalls aus der Änderungszeit und -größe berechnet werden, aber auch so konfiguriert werden können, dass sie vom Inode der Datei abhängen.
Raedwald
1

In PHP wer wird es brauchen.

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

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

header('ETag: "' . sprintf('%x-%x', $lastModified, $length) . '"');
Max Payne
quelle
3
Wie ist das besser als die akzeptierte Antwort?
RalfFriedl
1
@RalfFriedl diese Antwort wird für PHP-Programmierer besser sein, weil in Zukunft einige PHP-Programmierer wie ich nach 3 Schlüsselwörtern "nginx", "etag", "alg" suchen und er wird meine Antwort finden. Dies verhindert möglicherweise die Erstellung von Duplikaten von Fragen.
Max_Payne