【问题标题】:http cache and fingerprinting usagehttp缓存和指纹使用
【发布时间】:2014-09-02 04:49:22
【问题描述】:

我正在尝试了解 http 缓存和指纹识别的方式 作品。我已经将我的快速服务器设置为永远缓存资产,如下所示:

 router.use('/public', 
        express.static(path.join(__dirname, '..', 'public'), 
        { maxAge: 864000000 }));

我希望这会永远缓存资产,即使我更改了 文件的内容,因此我需要对文件名进行指纹识别 破坏缓存。但是;

这是重新加载后静态资产 common.js 的 Google Chrome 标头输出

 Remote Address:192.168.56.101:3000
 Request URL:http://192.168.56.101:3000/public/assets2/scripts/app/common.js
 Request Method:GET
 Status Code:304 Not Modified
 Request Headers
 GET /public/assets2/scripts/app/common.js HTTP/1.1
 Host: 192.168.56.101:3000
 Connection: keep-alive
 Cache-Control: max-age=0
 Accept: */ *
 If-None-Match: W/"ogrxaeWybJBlXMTTr2leWA=="
 If-Modified-Since: Fri, 11 Jul 2014 13:46:01 GMT
 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
 Referer: http://192.168.56.101:3000/
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
 Response Headers
 HTTP/1.1 304 Not Modified
 X-Powered-By: Express
 Accept-Ranges: bytes
 Date: Fri, 11 Jul 2014 13:48:34 GMT
 Cache-Control: public, max-age=864000
 Last-Modified: Fri, 11 Jul 2014 13:46:01 GMT
 ETag: W/"ogrxaeWybJBlXMTTr2leWA=="
 Connection: keep-alive

很好,我得到了 304。 现在我更改 common.js 的内容并再次重新加载,这是输出:

 Remote Address:192.168.56.101:3000
 Request URL:http://192.168.56.101:3000/public/assets2/scripts/app/common.js
 Request Method:GET
 Status Code:200 OK
 Request Headers
 GET /public/assets2/scripts/app/common.js HTTP/1.1
 Host: 192.168.56.101:3000
 Connection: keep-alive
 Cache-Control: max-age=0
 Accept: */ *
 If-None-Match: W/"ogrxaeWybJBlXMTTr2leWA=="
 If-Modified-Since: Fri, 11 Jul 2014 13:46:01 GMT
 User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36
 Referer: http://192.168.56.101:3000/
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: tr-TR,tr;q=0.8,en-US;q=0.6,en;q=0.4
 Response Headers
 HTTP/1.1 200 OK
 X-Powered-By: Express
 Accept-Ranges: bytes
 Date: Fri, 11 Jul 2014 13:50:35 GMT
 Cache-Control: public, max-age=864000
 Last-Modified: Fri, 11 Jul 2014 13:50:33 GMT
 ETag: W/"o65+0J5C8swpsmHMxNPH+w=="
 Content-Type: application/javascript
 Content-Length: 1908322
 Connection: keep-alive

此时,我希望得到 304,但 显然服务器检测到更改并发送了 200。

所以我不必使用指纹识别。我哪里做错了?

【问题讨论】:

    标签: javascript node.js http caching http-headers


    【解决方案1】:

    Express 通过将其保存在内存中,将其永久缓存在服务器端。我的猜测是 express 框架通过检查缓存的资源是否被修改来保持缓存的一致性。

    发送带有 if-none-match 和/或 if-modified-since 标头的请求是用户代理的正确行为。 IE 正在尝试通过跳过网络往返进行优化,这可能会导致页面加载不正确。

    您需要做的是要么使用指纹识别 - 为每个修改的资源分配一个新的通用名称 - 要么对服务器如何提供资源有更多的低级控制,即自己解析 url 并定义有关如何响应的规则形成,在您的情况下是 304 响应。

    【讨论】:

      【解决方案2】:

      我认为问题出在谷歌浏览器上,显然当我点击重新加载或在 url 栏上按 Enter 时,Chrome 仍然向服务器发送 If-None-Match 请求,并获得 200。我尝试使用 Internet Explorer,并且它成功地从缓存中服务器而不命中服务器。不过,我仍然想知道 Chrome 有什么问题,以及如何让它从缓存中提供服务而不访问服务器。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        • 2017-12-16
        • 2013-03-06
        • 1970-01-01
        • 2011-01-06
        相关资源
        最近更新 更多