为什么终端的 curl 请求总是给出 X-Cache-Status: MISS

为什么终端的 curl 请求总是给出 X-Cache-Status: MISS

我已经设置了 nginx 反向代理并使用 nginx 缓存向其中添加了缓存。

我可以使用添加的标头来验证所请求的副本是否已被缓存。

add_header X-Cache-Status $upstream_cache_status;

如果页面被访问超过两次,我就设置缓存页面。

proxy_cache_min_uses    2;

Nginx 缓存工作正常,如果我尝试从任何浏览器访问该网页,我可以看到X-Cache-Status: MISS两次及以后的显示。X-Cache-Status: HIT

但如果我尝试使用 curl 检查相同内容,如果页面未缓存,我会得到

X-Cache-Status: MISS

如果页面被缓存,我会得到

X-Cache-Status: HIT

但是我的问题是,我无法使用 curl 来预热缓存。我的意思是,我无法让 Web 服务器通过使用 curl 访问页面来缓存特定页面,即使我使用 curl 访问该页面 10 次。

这是为什么 ?

到目前为止我已经尝试过了。

curl -I https://example.com/page1
curl -v https://example.com/page1
curl --verbose https://example.com/page1
curl -svo /dev/null https://example.com/page1

使用最新的 centos 7x64

最新的 Nginx

[root]# curl -V
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.19.1 Basic ECC zlib/1.2.7 libidn/1.28 libssh2/1.4.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz

update1:​​这是我的 nginx 配置文件

proxy_cache_path    /usr/local/nginx/cache levels=1:2   keys_zone=mycache:10m       max_size=10g    use_temp_path=off;

server {

access_log  /dev/null;
listen my_ip:80;
server_name example.com ;

location / {
    access_log off;

    proxy_cache             mycache;
    proxy_cache_min_uses    2;
    proxy_cache_valid       200     10m;
    proxy_cache_valid       404     1m;

    proxy_cache_use_stale   error timeout invalid_header updating http_500 http_502 http_503 http_504;  
    proxy_cache_lock        on;

    proxy_pass http://box1.example.com/;

    proxy_set_header    X-Real-IP   $remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;

    #hide headers 
    proxy_hide_header Cache-Control;

    #ignore header
    proxy_ignore_headers Cache-Control Expires;

    #add custom headers for users
    add_header X-Cache-Status $upstream_cache_status;
    expires 3h;
    add_header Cache-Control "public, max-age=10800, s-maxage=10800";

    #add no mobile redirect cookie
    add_header Set-Cookie "__cf_mob_redir=0;Domain=.example.com;";
}
}

更新 2:
我在我的域上使用 cloudflare。我尝试完全禁用 cloudflare 服务,仅将其用作 DNS 服务器。再次尝试使用 curl 并得到相同的响应。

无论是否启用 cloudflare,curl 都无法使页面缓存。


更新3:

尝试使用不同的用户代理但收到相同的响应。

curl -A "Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3" -svo /dev/null http://example.com/some-page

答案1

0) 如我所见,您检查了https://站点,但检查了版本配置http://。我猜您这种情况没有问题,但最好检查一下您是否编辑了正确的配置文件。1
) 您应该检查从上游获得的内容curl -I http://box1.example.com/page1,我猜应该有Set-Cookie标头。因此,您应该在上游的回复中添加Set-Cookieproxy_ignore_headers删除 cookie。或者使用单独的位置:一个用于可以忽略缓存 cookie 的页面,另一个用于不能忽略 cookie 的页面。

相关内容