caching - nginx proxy_cache key hash 在每个其他浏览器请求上发生变化

标签 caching nginx

我是这样创建 nginx 的配置的:

proxy_cache_path /tmp/nginx/static levels=1:2 keys_zone=static_zone:10m inactive=10d use_temp_path$
proxy_cache_key "$request_uri$args";

location ~* \.(css|gif|ico|jpe?g|js(on)?|png|svg|webp|ttf|woff|woff2|txt|map)$ {
            proxy_hide_header Date;
            proxy_cache_revalidate on;
            proxy_pass http://static:8080;
            proxy_cache_bypass $cookie_nocache $arg_nocache;
            proxy_ignore_headers "Cache-Control" "Expires" "Set-Cookie";
            proxy_hide_header "Set-Cookie";
            proxy_buffering on;
            proxy_cache static_zone;

            proxy_cache_valid 200 301 302 30m;
            proxy_cache_valid 404 10m;
            #expires max;
            add_header X-Proxy-Cache $upstream_cache_status;

            access_log      off;
            add_header      Cache-Control   "public";
            add_header      Pragma          "public";
            expires         30d;
            log_not_found   off;
            tcp_nodelay     off;
}

在来自 Chrome 的第一个请求中,所有工作都像 x-proxy-cache:MISS 其他请求从磁盘缓存中获得, header 为 x-proxy-cache:HIT。刷新后也是HIT。但是当我在这台机器上从其他浏览器(Opera、Edge)打开页面时,这个请求是 MISS。在文件系统 nginx 中,在相同内容上创建两个具有不同 md5sum 散列的文件。例如文件名 438476ac40665c852d3acde1acf769f1 head:

^C^@^@^@^@^@^@^@/^V
W^@^@^@^@��^CW^@^@^@^@'^O
W^@^@^@^@m�,�^@^@�^@�^A^N"5703e3a7-67e"^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@$
KEY: /js/catalog.js
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 12 Apr 2016 15:07:19 GMT
Content-Type: application/javascript
Content-Length: 1662
Last-Modified: Tue, 05 Apr 2016 16:11:19 GMT
Connection: close
Vary: Accept-Encoding
ETag: "5703e3a7-67e"
Accept-Ranges: bytes

第二个文件名为a6f57423c2220fba3ada5f516f6dd91c,内容相同,头部为:

^C^@^@^@^@^@^@^@        ^V
W^@^@^@^@��^CW^@^@^@^@^A^O
W^@^@^@^@m�,�^@^@�^@�^A^N"5703e3a7-67e"^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@$
KEY: /js/catalog.js
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 12 Apr 2016 15:06:41 GMT
Content-Type: application/javascript
Content-Length: 1662
Last-Modified: Tue, 05 Apr 2016 16:11:19 GMT
Connection: close
Vary: Accept-Encoding
ETag: "5703e3a7-67e"
Accept-Ranges: bytes

根据文档,文件名必须是来自 key 的 md5,并且有 echo -n '/js/catalog.js'| md5sum 是 a6f57423c2220fba3ada5f516f6dd91c 作为其中一个文件的名称(这是第一个请求)。我不想在每个用户|浏览器的服务器 js|css 中缓存。只需缓存一次并从缓存中接收所有用户请求。附言我的网站使用https、http2、nginx 1.9.14版本。

最佳答案

根据那里的 Vary: Accept-Encoding header ,我猜测 Edge 和 Opera 会为请求发送不同的“Accept-Encoding” header 。例如,一个可以简单地发送“gzip”,而另一个发送“gzip,deflate”。这些在技术上是不同的 Accept-Encoding request header 。

如果您知道来源不会发送有意义的不同编码,这些编码在浏览器之间不起作用,您可以添加:

proxy_ignore_headers Vary;

您已经有了 proxy_ignore_headers,所以您可以添加到它。

由于所有主流浏览器都支持 gzip,因此风险可能非常低。然而,“webp”也是通过 Accept-Encoding 完成的,因此如果源可以处理 webp,这可能会对某些图像产生令人惊讶的结果。

关于caching - nginx proxy_cache key hash 在每个其他浏览器请求上发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36578040/

相关文章:

r - 在 R 中缓存昂贵的操作

algorithm - 关于缓存的一些基本疑问

error-handling - 在Nginx中,它必须是自动索引或目录禁止错误?

python - Nginx/Django 文件上传权限

nginx - 无法在 Nginx 服务器中使用 LetsEncrypt 设置 HTTPS

ssl - 客户端证书提示不显示nginx

java - 如何清理tomcat缓存?

asp.net - ASP.Net 使用什么缓存算法?

node.js - Nginx 无法正确代理 Nodejs

java - Volatile HashMap 与 ConcurrentHashMap