Nginx代理缓存适用于curl,但不适用于浏览器

时间:2016-10-04 15:23:58

标签: caching curl nginx

我已经配置了Nginx缓存,主要使用Nginx's own documentation。当我调用应使用curl缓存的网址时,它的工作方式完全符合预期:第一次请求时为MISS,后续请求时为HIT。但是,当我在任何主要浏览器中调用相同的网址时,我每次都会收到MISS - 即使curl刚刚调用了相同的网址并进行了缓存。

这是我的Nginx配置:

proxy_cache_path /tmp/nginx levels=1:2 keys_zone=lb_cache:10m inactive=60m use_temp_path=off;
proxy_cache_key "$request_method$host$request_uri";

proxy_cache_lock on; 
proxy_cache_use_stale updating;

server {
    location / {
        proxy_cache lb_cache;

        proxy_ignore_headers Expires;
        proxy_hide_header Expires;

        proxy_cache_valid 200 60m; 
        proxy_cache_revalidate on; 

        proxy_no_cache $no_cache;
        proxy_cache_bypass $http_cache_control $http_pragma $cookie_nocache $arg_nocache;

        add_header X-Cache-Status $upstream_cache_status;

        proxy_pass http://webservers;

        if ($request_uri ~* "/(admin/)") {
            set $no_cache true;
        }   
        if ($http_cookie ~* "SESS") {
            set $no_cache true;
        }
    }
}

如何确保我的缓存一直被使用,以及在发出导致缓存丢失的请求时,与curl不同的浏览器是什么?

2 个答案:

答案 0 :(得分:0)

curl和浏览器之间的主要区别在于浏览器会记住/缓存资源 - 因此cookie可能负责(可能是if ($http_cookie ~* "SESS") { set $no_cache true; }部分),或者浏览器在请求中使用的标头更改缓存的使用。

我会比较curl和浏览器在这种情况下提出的确切请求 - 例如Firebug。通过这种方式,您可以找到浏览器发送的卷发不发送的内容。

答案 1 :(得分:0)

问题原来是网站发送的return region; 标题。它正在运行Drupal 7,它显然被配置为传递Vary标头以进行自己的缓存清除。在Nginx中忽略该标题解决了这个问题。