用法介绍状态码304(状态码304的含义)

一、概述

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的功能。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平