14

What is the algorithm used to generate etags in Nginx? They look something like "554b73dc-6f0d" now.

Are they generated from timestamp only?

  • 1
    I don't believe they contain an inode (unlike Apache by default)... although I'm having a hard time finding where I found that a long time ago (better for a cache cluster). Are you working in an environment without a useful clock (eg. embedded)? – Cameron Kerr May 7 '15 at 15:20
  • 1
    There is some related info in developer.yahoo.com/performance/rules.html#etags (but not regarding Nginx) – Cameron Kerr May 7 '15 at 15:26
26

From the source code: 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 }

You can see on lines 1830 and 1831 that the input is the last modified time and the content length.

Cheers, Cameron

-1

In PHP who will need it.

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

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

header('ETag: "' . sprintf('%x-%x', $lastModified, $length) . '"');
  • 3
    How is this better than the accepted answer? – RalfFriedl Nov 24 '18 at 14:21
  • 1
    @RalfFriedl this answer will be better for PHP programmers, because in the future some PHP programmer like me will look for 3 keywords "nginx", "etag", "alg" and he will find my answer. This perhaps will prevent the creation of duplication of questions. – Max_Payne Nov 24 '18 at 14:34

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.