一、概述
HTTP协议中,状态码是客户端向服务器请求后服务器响应的状态标识,不同状态码代表着不同的含义和处理方式。状态码304表示资源未被修改,客户端可以使用缓存中的数据。当请求资源的日期时间早于或等于上次请求资源的日期时间时,服务器返回304状态码,通知客户端可以使用缓存。
二、304状态码的意义和作用
304状态码是为了优化Web应用性能而设计的一种状态码。当某一Web资源未被修改时,发送304状态码可以减轻服务器的负担,减少资源和带宽的浪费。在HTTP1.0中,当客户端请求一个页面时,服务器会返回整个页面的内容;在HTTP1.1中,服务器会发送一个未修改标识符,如果客户端请求相同的资源,则服务器会返回状态码304,客户端可以直接使用缓存中的数据,从而减少带宽的占用。
三、浏览器缓存的机制
浏览器缓存机制是指在客户端缓存一些数据,这样相同的请求可以直接从浏览器缓存中获取数据,从而减少服务器的负担。浏览器缓存机制分为两种,一种是强制缓存,另一种是协商缓存。
强制缓存是指在缓存有效期内,浏览器在请求相同资源时会优先从缓存中获取数据,而不去重新请求服务器。如果缓存过期,则浏览器才会发起请求,否则直接从缓存中获取资源。强制缓存可以通过设置响应头实现。
协商缓存是在强制缓存失效时,使用HTTP Header中的一组属性,由客户端和服务器通过约定进行缓存处理。当客户端请求某个资源时,服务器会返回一个Last-Modified或ETag,客户端需要在下一次请求时带上If-Modified-Since或If-None-Match,如果服务器返回304状态码,则说明资源未被修改,可以使用客户端缓存中的数据。
四、代码示例
// 强制缓存示例 app.get('/static/*', function(req, res, next) { res.setHeader('Cache-Control', 'max-age=' + 3600*24*365); res.setHeader('Expires', new Date(Date.now() + 3600*24*365*1000).toUTCString()); next(); }); // 协商缓存示例 app.get('/api/*', function(req, res, next) { const lastModified = new Date(fs.statSync(filename).mtime).toUTCString(); res.setHeader('Last-Modified', lastModified); next(); }); app.get('/api/*', function(req, res, next) { const ifModifiedSince = req.headers['if-modified-since']; if (ifModifiedSince && ifModifiedSince === lastModified) { res.writeHead(304, 'Not Modified'); res.end(); } else { next(); } });
五、结论
状态码304是为了优化Web性能而设计的一种状态码,可以减轻服务器的负担,减少资源和带宽的浪费。在实际开发中,可以通过强制缓存和协商缓存来实现状态码304的功能。