2017-05-29 28 views
0

私はそうのような通常のHTMLレイアウトを単一ページのアプリケーションを設計しています:Node.jsのサーバー上でノードJS、ブラウザのキャッシュと304応答

<html> 
    <head> 
    <title>...</title> 
    <link rel="stylesheet" media="all" type="text/css" href="css/main.css"> 
    ...more meta tags 
    </head> 
    <body> 
    <!--body generated with templates--> 
    <script src="js/main.js"></script> 
    </body> 
</html> 

:私は

route.get(req, function(url, type, hdr) { 
    if (type === 'error') { 
    //response 404 
    }else if (type === 'page') { 
    console.log(url); 
    fileSys.stat(url, function(err, stat) { 
     if (err) { 
     res.statusCode = 404; 
     res.setHeader("Content-Type","text/plain"); 
     res.write("404 Not Found"); 
     res.end(); 
     }else { 
     var file, 
     headers = {}, 
     modif = req.headers['if-modified-since']; 
     if (modif && new Date(modif).getTime() === stat.mtime.getTime()) { //STATUS 304 
      headers = { 
      'Last-Modified': stat.mtime.toUTCString(), 
      'Date': new Date().toUTCString() 
      }; 
      res.writeHead(304, headers); 
      res.end(); 
     }else { //STATUS 200 
      if (path.extname(url) === '.jpg' || path.extname(url) === '.png') 
      file = fileSys.readFileSync(url); 
      else { 
      if (fileSys.statSync(url).isDirectory()) 
       url += '/index.html'; 
      file = fileSys.readFileSync(url, 'binary'); 
      } 
      headers = { 
      'Last-Modified': stat.mtime.toUTCString(), 
      'Content-Length': stat.size, 
      'Cache-Control': 'public, max-age=31536000', 
      'ETag': url+'_'+stat.mtime.getTime(), 
      'Date': new Date().toUTCString() 
      }; 
      var contentType = contentExtens[path.extname(url)]; 
      if (contentType) 
      headers['Content-Type'] = contentType; 
      res.writeHeader(200, headers); 
      res.end(file); 
     } 
     } 
    }); 
    } 
}); 

私は、私のChromeキャッシュをクリアした後、私のインデックスページとサーバー側をリフレッシュしています。画像。しかし、別の時間にインデックスページをリロードすると、リソースがないインデックスページだけが要求されます。ブラウザのコンソールでは、すべてが304でキャッシュからロードされます。これは正常な動作ですか?画像やリソースファイルに何らかの変更を加えると、mtimeはそれらの要求が送信されていないので比較できません。

また、私はSafari上で、キャッシュ、最後に変更された、etagヘッダーを設定した後でも、すべてのリソースが送信されていることに気付きました。これがどう動くべきか理解していないのですか、これはブラウザのものか、何か間違っているのでしょうか?

答えて

0

私はthis articleを読むまでブラウザのキャッシングがどのように動作するのかよく分かりませんでした。それは私が1年間すべてをキャッシュしているということに目を開けました。メインページは毎回要求されますが、ページのリソースは1年間キャッシュされ、ユーザーによってキャッシュがクリアされるか、1年が経過するまでリクエストされません。したがって、解決策は、Cache Controlno-cacheに設定し、それでもなおある値にETagを設定することです。その場合は、各リソースのリクエストが送信され、変更されたものがあるかどうかはあなた自身が決定します。または、長期間キャッシュを継続しますが、リソースを変更するときは、index.htmlページ(例:main.V4.jsまたはmycss.x845.css)内に値を追加してください。ブラウザはこの新しいファイル名に遭遇し、新しいファイル名を送信します。

これは誰かを助けてくれることを願っています。何か問題があれば追加してください!

関連する問題