nginx etag 생성의 알고리즘


17

Nginx에서 etag를 생성하는 데 사용되는 알고리즘은 무엇입니까? 그들은 이제 "554b73dc-6f0d"와 같이 보입니다.

타임 스탬프에서만 생성됩니까?


1
나는 그들이 inode (기본적으로 Apache와 달리)를 포함하고 있다고 생각하지 않습니다 ...하지만 오래 전에 발견 한 곳을 찾는 데 어려움을 겪고 있습니다 (캐시 클러스터가 더 낫습니다). 유용한 시계 (예 : 내장)가없는 환경에서 작업하고 있습니까?
Cameron Kerr

1
거기에 몇 가지 관련 정보입니다 developer.yahoo.com/performance/rules.html#etags은 (그러나 Nginx에 관한되지 않음)
카메론 커

답변:


32

소스 코드에서 : 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 }

1830 및 1831 행에서 입력이 마지막으로 수정 된 시간 및 내용 길이임을 알 수 있습니다.


수정 시간과 크기에서 계산되지만 파일의 inode에 따라 구성 할 수도있는 Apache ETag 와 비교 하십시오.
Raedwald

1

PHP에서는 누가 필요합니다.

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

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

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

3
이것이 허용되는 답변보다 어떻게 낫습니까?
RalfFriedl

1
@RalfFriedl이 답변은 PHP 프로그래머에게 더 좋을 것입니다. 앞으로 나와 같은 일부 PHP 프로그래머는 3 개의 키워드 "nginx", "etag", "alg"를 찾고 내 답변을 찾을 수 있기 때문입니다. 이것은 아마도 질문의 복제를 막을 것입니다.
Max_Payne
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.