我已经配置了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不同的浏览器是什么?
答案 0 :(得分:0)
curl和浏览器之间的主要区别在于浏览器会记住/缓存资源 - 因此cookie可能负责(可能是if ($http_cookie ~* "SESS") { set $no_cache true; }
部分),或者浏览器在请求中使用的标头更改缓存的使用。
我会比较curl和浏览器在这种情况下提出的确切请求 - 例如Firebug。通过这种方式,您可以找到浏览器发送的卷发不发送的内容。
答案 1 :(得分:0)
问题原来是网站发送的return region;
标题。它正在运行Drupal 7,它显然被配置为传递Vary
标头以进行自己的缓存清除。在Nginx中忽略该标题解决了这个问题。