🎬 HoRain 云小助手个人主页

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

目录

⛳️ 推荐

一、ETag 的作用

二、工作流程

1. 首次请求(无缓存)

2. 再次请求(缓存验证)

三、服务器端实现示例

Node.js(Express)

Nginx 配置

四、ETag 的生成策略

五、ETag 与 Last-Modified 的对比

六、注意事项

总结


通过 ETag(实体标签)实现 HTTP 缓存验证是一种高效的资源缓存策略,它允许客户端和服务器快速判断资源是否发生变化。以下是详细实现原理和步骤:


一、ETag 的作用

ETag 是服务器为资源生成的唯一标识符(通常是哈希值或版本号)。当资源更新时,ETag 会变化,客户端通过对比 ETag 验证本地缓存是否失效。


二、工作流程

1. 首次请求(无缓存)
  • 客户端请求资源:

    GET /api/data HTTP/1.1
  • 服务器返回资源及 ETag:

    HTTP/1.1 200 OK
    ETag: "abc123"
    Content-Type: application/json
    {"data": "example"}
  • 客户端缓存资源及 ETag。

2. 再次请求(缓存验证)
  • 客户端在 If-None-Match头中携带缓存的 ETag:

    GET /api/data HTTP/1.1
    If-None-Match: "abc123"
  • 服务器比较当前资源的 ETag 与 If-None-Match的值:

    • 若匹配:返回 304 Not Modified(不返回内容),客户端使用缓存。

      HTTP/1.1 304 Not Modified
      ETag: "abc123"
    • 若不匹配:返回 200 OK及新资源和 ETag。

      HTTP/1.1 200 OK
      ETag: "def456"
      {"data": "updated"}

三、服务器端实现示例

Node.js(Express)
app.get('/resource', (req, res) => {
  const data = { content: 'Hello World' };
  const etag = generateETag(JSON.stringify(data)); // 生成ETag(如MD5哈希)
  
  // 检查客户端ETag是否匹配
  if (req.headers['if-none-match'] === etag) {
    res.status(304).end(); // 缓存有效
  } else {
    res.set('ETag', etag);
    res.json(data);
  }
});
Nginx 配置
location /static/ {
  etag on; # 启用ETag(默认基于修改时间和文件大小)
}

四、ETag 的生成策略

  1. 1.

    强验证 ETag:要求资源字节完全一致(默认策略)。

  2. 2.

    弱验证 ETag(以 W/前缀开头):允许语义相同但内容微小差异(如空格),如:

    ETag: W/"abc123"

五、ETag 与 Last-Modified 的对比

特性

ETag

Last-Modified

精度

高(可检测内容变化)

低(仅时间戳,秒级)

灵活性

可自定义(如哈希)

依赖文件系统时间

适用场景

动态内容、频繁更新

静态文件

可同时使用两者,服务器优先处理 If-None-Match(ETag)。


六、注意事项

  1. 1.

    性能开销:动态生成 ETag(如计算哈希)可能增加服务器负载。

  2. 2.

    分布式系统:确保多台服务器生成的 ETag 一致(如使用统一算法)。

  3. 3.

    缓存控制:需配合 Cache-Control头(如 max-age)管理缓存生命周期。


总结

ETag 通过标识资源版本实现精确的缓存验证,减少不必要的数据传输。结合 Cache-Control策略,可显著提升性能并节省带宽。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐