Vladislav Rastrusny Asked: 2015-05-08 06:23:42 +0800 CST2015-05-08 06:23:42 +0800 CST 2015-05-08 06:23:42 +0800 CST nginx etag 生成背后的算法 772 在 Nginx 中生成 etags 的算法是什么?它们现在看起来像“554b73dc-6f0d”。 它们是否仅从时间戳生成? nginx 2 个回答 Voted Best Answer Cameron Kerr 2015-05-08T07:39:38+08:002015-05-08T07:39:38+08:00 来自源代码: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 行看到输入是最后修改时间和内容长度。 Max_Payne 2018-11-25T06:14:23+08:002018-11-25T06:14:23+08:00 在 PHP 中谁会需要它。 $pathToFile = '/path/to/file.png'; $lastModified = filemtime($pathToFile); $length = filesize($pathToFile); header('ETag: "' . sprintf('%x-%x', $lastModified, $length) . '"');
来自源代码:http ://lxr.nginx.org/ident?_i=ngx_http_set_etag
您可以在第 1830 和 1831 行看到输入是最后修改时间和内容长度。
在 PHP 中谁会需要它。