原因:

nginx作为静态资源服务器,重新构建后发生浏览器页面直接取缓存中的js等文件名,但是由于服务器中文件已经被替换导致出现异常。

浏览器在下次请求这个资源的时候不会将请求发向后端,而是直接从缓存中获取资源。

出现这种情况的原因是缓存机制导致的。

强缓存与协商缓存的区别

  强缓存:浏览器不与服务端协商直接取浏览器缓存

  协商缓存:浏览器会先向服务器确认资源的有效性后才决定是从缓存中取资源还是重新获取资源

协商缓存运作原理

  现在有一个这样的业务情景:后端的静态资源会不定时地发生更新,而因为浏览器默认使用强缓存,会默认从浏览器缓存中取到过时的资源。

  现在我们希望浏览器每次获取资源的时候都向后端确认资源是否更新,就要设置浏览器使用协商缓存

  那么后端如何判断资源是否更新了呢?这时就要用到Etag和Last-Modified两项响应头。

  每次收到一个静态资源的请求时,后端都将资源的最后修改时间(Last-Modified)、根据资源内容计算出来的Etag放在响应头给前端。

  前端收到响应后将这两项缓存起来,然后在下次请求同样资源的时候,将这两项的内容放到If-Modified-Since和If-None-Match这两项请求头中。

  服务端收到这两项后,会与资源当前生成的Etag和Last-Modified做比较,如果两者都一致,说明资源没有更新,服务端会返回304空响应;否则,说明资源有更新,服务端会将完整的资源内容返回


解决办法:

利用nginx设置浏览器协商缓存

使用nginx作为静态资源的服务器,再在响应头加上Cache-Control:no-cache就可以了。

在nginx的配置中添加如下,问题解决:

add_header Cache-Control no-cache;

location / {
    add_header Cache-Control no-cache;
    alias /usr/local/nginx/test;
}