Algoritmo por trás da geração do etgin nginx

17

Qual é o algoritmo usado para gerar etags no Nginx? Eles se parecem com "554b73dc-6f0d" agora.

Eles são gerados apenas de carimbo de data e hora?

Vladislav Rastrusny
fonte
11
Eu não acredito que eles contenham um inode (ao contrário do Apache por padrão) ... embora eu esteja tendo dificuldades para encontrar onde descobri isso há muito tempo (melhor para um cluster de cache). Você está trabalhando em um ambiente sem um relógio útil (por exemplo, incorporado)?
Cameron Kerr #
11
Existe alguma informação relacionada em developer.yahoo.com/performance/rules.html#etags (mas não sobre Nginx)
Cameron Kerr

Respostas:

32

No código-fonte: 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 }

Você pode ver nas linhas 1830 e 1831 que a entrada é a hora da última modificação e o comprimento do conteúdo.

Cameron Kerr
fonte
Compare com o Apache ETags , que também são calculados a partir do tempo e tamanho da modificação, mas também podem ser configurados para depender do inode do arquivo.
Raedwald
1

Em PHP, quem vai precisar.

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

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

header('ETag: "' . sprintf('%x-%x', $lastModified, $length) . '"');
Max_Payne
fonte
3
Como isso é melhor do que a resposta aceita?
RalfFriedl
11
@RalfFriedl esta resposta será melhor para programadores PHP, porque no futuro algum programador PHP como eu procurará 3 palavras-chave "nginx", "etag", "alg" e ele encontrará minha resposta. Isso talvez impeça a criação de duplicação de perguntas.
Max_Payne