在 linux 中,nginx 针对静态图片设置长效缓存有效期,核心做法是在 `server` 或 `location` 块中使用 `expires` 指令并指定一个较长的时间值(如 30 天、1 年等)。这样做会让 nginx 在响应头中自动添加 `cache-control` 和 `expires` 字段,浏览器据此在有效期内直接从本地读取图片,不再向服务器发起请求,从而显著降低带宽消耗并提升加载速度。需要注意的是,如果图片内容更新但文件名不变,用户可能看到旧图,因此通常建议配合文件版本化或哈希命名策略使用。

如何配置 location 块以匹配所有图片类型
要匹配所有常见的图片格式,可以使用正则表达式定位 `.jpg`、`.png`、`.gif`、`.webp` 等后缀的文件路径,并在该 `location` 块内设置 `expires`。以下是一个完整的 Nginx 配置文件片段,展示了如何将这些规则嵌入到标准的 Web 服务配置中。

server {
listen 80;
server_name example.com;
root /var/www/html;
# 默认配置
location / {
try_files $uri $uri/ =404;
}
# 静态图片长效缓存配置
location ~* \.(jpg|jpeg|png|gif|ico|webp|svg)$ {
expires 365d;
add_header Cache-Control "public, immutable";
access_log off;
log_not_found off;
}
}
在上述配置中,`~*` 表示不区分大小写的正则匹配。`expires 365d;` 将缓存有效期设置为一年。`add_header Cache-Control "public, immutable";` 进一步告知浏览器资源不会改变,无需验证。`access_log off;` 关闭对静态资源的访问日志记录,减少磁盘 I/O 压力。重启 Nginx 后生效:`sudo nginx -s reload`。
如何处理缓存失效与版本控制冲突
当图片内容更新时,若 URL 不变,浏览器仍会返回缓存中的旧图。解决此问题的标准做法是修改文件名或添加查询参数版本号。例如,将 `image.jpg` 改为 `image_v2.jpg` 或在 URL 后追加 `?v=2`。Nginx 本身不解析业务逻辑,因此需在应用层或构建流程中生成带版本标识的资源路径。

// 前端 HTML 引用示例
@@##@@
// Nginx 配置保持不变,仍匹配 .png
location ~* \.(jpg|jpeg|png|gif|ico|webp|svg)$ {
expires 365d;
add_header Cache-Control "public, immutable";
}
通过这种方式,每次更新图片时只需更改文件名或版本号,新 URL 触发 Nginx 正常响应并重新缓存,而旧 URL 因命中缓存继续快速返回。避免使用 `no-cache` 或 `max-age=0`,否则失去长效缓存意义。对于动态生成的图片(如缩略图),可单独设置较短的 `expires` 值,例如 `expires 1h;`,以平衡实时性与性能。
基于 expires 365d 配置下浏览器行为的具体表现
当配置了 `expires 365d;` 后,浏览器首次请求图片时会收到包含 `Cache-Control: max-age=31536000` 和 `Expires` 未来时间戳的响应头。后续 365 天内,浏览器直接读取本地副本,不发送任何 HTTP 请求。开发者工具 Network 面板中显示状态码为 `(from cache)` 或 `200 (from memory cache)`,无网络延迟。若强制刷新(Ctrl+F5),则忽略缓存重新请求。此行为符合 HTTP/1.1 规范,且被所有现代浏览器支持。











