नग्नेक्स एटा जनरेशन के पीछे एल्गोरिदम


17

Nginx में etags उत्पन्न करने के लिए उपयोग किया जाने वाला एल्गोरिथ्म क्या है? वे अब "554b73dc-6f0d" की तरह दिखते हैं।

क्या वे टाइमस्टैम्प से ही उत्पन्न होते हैं?


1
मुझे विश्वास नहीं है कि उनमें एक इनकोड होता है (डिफ़ॉल्ट रूप से अपाचे के विपरीत) ... हालांकि मुझे एक कठिन समय मिल रहा है जहां मैंने पाया कि बहुत समय पहले (कैश क्लस्टर के लिए बेहतर)। क्या आप एक उपयोगी घड़ी (जैसे एम्बेडेड) के बिना एक वातावरण में काम कर रहे हैं?
कैमरन केर

1
डेवलपर में कुछ संबंधित जानकारी है। याहू / इनफॉर्मर /rules.html#etags (लेकिन नगनेक्स के बारे में नहीं)
कैमरून केर

जवाबों:


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 की तर्ज पर देख सकते हैं कि इनपुट अंतिम संशोधित समय और सामग्री की लंबाई है।


अपाचे ईटैग्स के साथ तुलना करें , जो कि संशोधन समय और आकार से भी गणना की जाती है, लेकिन फ़ाइल के इनोड पर निर्भर करने के लिए भी कॉन्फ़िगर किया जा सकता है।
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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.