Nginx etag nesli arkasındaki algoritma


17

Nginx'te etags oluşturmak için kullanılan algoritma nedir? Şimdi "554b73dc-6f0d" gibi bir şeye benziyorlar.

Sadece zaman damgasından mı üretiliyorlar?


1
Ben bir inode (varsayılan olarak Apache aksine) içerdiğine inanmıyorum ... Ben uzun zaman önce (önbellek kümesi için daha iyi) buldum nerede bulmak zor bir zaman yaşıyorum. Yararlı bir saati olmayan bir ortamda mı çalışıyorsunuz (örn. Gömülü)?
Cameron Kerr

1
Developer.yahoo.com/performance/rules.html#etags içinde bazı ilgili bilgiler var (ancak Nginx ile ilgili değil)
Cameron Kerr

Yanıtlar:


32

Kaynak koddan: 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 ve 1831 satırlarında, girdinin son değiştirilme zamanı ve içerik uzunluğu olduğunu görebilirsiniz.


Değişiklik zamanı ve boyutundan da hesaplanan, ancak dosyanın inode'una bağlı olarak yapılandırılabilen Apache ETag'lerle karşılaştırın .
Raedwald

1

PHP'de kimin ihtiyacı olacak.

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

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

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

3
Bu kabul edilen cevaptan nasıl daha iyi?
RalfFriedl

1
@RalfFriedl bu cevap PHP programcıları için daha iyi olacak, çünkü gelecekte benim gibi bazı PHP programcısı 3 anahtar kelime "nginx", "etag", "alg" arayacak ve cevabımı bulacak. Bu belki de soruların tekrarlanmasını önleyecektir.
Max_Payne
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.