NGINX中某些请求的响应没有etag

nginx官网上说默认是开启etag的。

Syntax:    etag on | off;
Default:    
etag on;
Context:    http, server, location
This directive appeared in version 1.3.3.

为什么在同一站点的不同页面,有些请求有会etag,某些则不会呢?

图片描述

图片描述

阅读 9.2k
3 个回答

对于nginx,etag的格式是 unixtime-filesize
unixtime: 文件的修改时间的unix time的十六进制
filesize: 文件大小(字节)的十六进制
如果返回的内容是压缩过的,那采用weak etag,算法是一样的。

所以,要产生etag,必须有两个条件:

  1. 文件时间

  2. 文件大小

对于反代(包括proxy_pass, uwsgi_pass, fast-cgi等),不会创建etag,头部都是由upstream创建
一般来讲,只有存在磁盘上的文件,由nginx直接读取,才会产生etag

第一个请求,是一个静态的首页
etag是59697ad6-210
59697ad6转换成十进制是1500084950,时间是2017/7/15 10:15:50 +8,这是你web server上文件的修改时间
210转换成十进制是528,就是文件的大小

第二个请求是php,通常是fast-cgi,时间和大小都无法预先确定,所以没有etag

传输方式不同,第二个请求的 body 传输是 chunk 方式,简单来说,就是数据没有一次性传输完,没法计算传说数据的 Etag

我也遇到这个问题了,测试环境没有,生产环境有,
看了下测试环境版本是1.4.6 生产环境是1.16 都开启了gzip 猜猜和版本有关系
看了这篇文章,说的还比较符合
https://www.cnblogs.com/golov...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题