Algoritma di belakang generasi nginx etag


17

Apa algoritma yang digunakan untuk menghasilkan etag di Nginx? Mereka terlihat seperti "554b73dc-6f0d" sekarang.

Apakah hanya dihasilkan dari timestamp?


1
Saya tidak percaya mereka mengandung inode (tidak seperti Apache secara default) ... walaupun saya mengalami kesulitan menemukan di mana saya menemukan itu sejak lama (lebih baik untuk cache cluster). Apakah Anda bekerja di lingkungan tanpa jam yang berguna (mis. Tertanam)?
Cameron Kerr

1
Ada beberapa info terkait di developer.yahoo.com/performance/rules.html#etags (tetapi tidak mengenai Nginx)
Cameron Kerr

Jawaban:


32

Dari kode sumber: 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 }

Anda dapat melihat pada baris 1830 dan 1831 bahwa input adalah waktu modifikasi terakhir dan panjang konten.


Bandingkan dengan Apache ETags , yang juga dihitung dari waktu dan ukuran modifikasi, tetapi juga dapat dikonfigurasi untuk bergantung pada inode file.
Raedwald

1

Dalam PHP siapa yang akan membutuhkannya.

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

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

header('ETag: "' . sprintf('%x-%x', $lastModified, $length) . '"');

3
Bagaimana ini lebih baik daripada jawaban yang diterima?
RalfFriedl

1
@RalfFriedl jawaban ini akan lebih baik untuk programmer PHP, karena di masa depan beberapa programmer PHP seperti saya akan mencari 3 kata kunci "nginx", "etag", "alg" dan dia akan menemukan jawaban saya. Ini mungkin akan mencegah terciptanya duplikasi pertanyaan.
Max_Payne
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.