- nginx默认根据配置的
proxy_cache_key
计算出 KEY(32 位 Hash 值,小写) - 例如:
- 访问:https://www.test.com/test.js,缓存文件名生成即为
- 当请求头传递Accept-Encoding:gzip,源站支持gzip压缩后,响应头返回Vary字段,根据标准的 HTTP 协议,服务端(源站)应该在响应头设置 Vary 字段,来显示指定这些影响缓存的头部字段,缓存系统需要支持这种协商机制,对不同的客户端请求返回不同的资源
- 此时同一个路径下md5加密会出现多份缓存,不在简单的md5加密$hostrequest_uri值,而是在原来的加密路径值上再做二次md5加密,根据请求头Accept-Encoding值变化拼接生成响应的缓存,也就是说同个路径根据Accept-Encoding请求头传值不一样生成不同的缓存
- 例如Accept-Encoding:gzip和Accept-Encoding:空,会产生两份缓存,一份压缩缓存,一份未压缩缓存
- 查看nginx源码部分看看具体缓存创建规则是怎么实现的,源站地址
- nginx会根据源站返回的Vary字段,匹配对应的Accept-Charset,Accept-Encoding,Accept-Language三个请求头值参与缓存key加密生成
- nginx编译安装--with-debug模块可以看到nginx自带的完整打印日志过程ngx_log_debug1
- 关键在于源码第1129行
r->cache->main这个初始值是什么,修改源码添加日志输出打印
发现这是一个md5($hostrequest_uri)后16进制字符串
- 即md5加密规则为