Nginx 的 map 指令通过动态生成变量(如 $expires_time)配合 expires 指令实现差异化缓存控制,支持按 MIME 类型、文件扩展名或 URI 路径设置不同过期时间,并需注意 Nginx 版本、变量作用域及调试方法。

Nginx 的 map 指令本身不直接设置 expires,但它可以动态生成变量,再配合 expires 指令实现按资源类型、路径或请求特征差异化设置缓存过期时间。
用 map 构建缓存策略变量
在 http 块中定义一个映射关系,将文件扩展名(或 URI 路径)映射为对应的过期时长字符串(如 "1h"、"1y"):
map $sent_http_content_type $expires_time {
default "epoch";
~*^text/ "1h";
~*^image/ "1y";
~*^application/javascript "1h";
~*^application/css "1h";
~*\.(ico|png|jpg|jpeg|gif|webp|svg)$ "1y";
}说明:
– $sent_http_content_type 是响应头中的 MIME 类型,更准确反映实际返回内容;也可用 $request_filename 或 $uri 匹配路径;
– 正则匹配需加 ~*(忽略大小写),值必须是合法的 expires 参数(如 "off"、"epoch"、"1d");
– default "epoch" 表示不缓存(强制过期),避免未匹配时继承上游配置。
在 location 中应用变量控制 expires
在静态资源所在的 location 块中启用该变量:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2|ttf|eot)$ {
expires $expires_time;
add_header Cache-Control "public, immutable";
}注意:
– expires 指令支持变量,但仅限于 Nginx 1.7.9+;
– 若使用 $request_filename 判断后缀,需确保文件真实存在(可配合 try_files);
– 避免在同一个 location 中混用 expires 字面值和变量,可能导致覆盖或未定义行为。
进阶:结合 URI 路径做精细化控制
例如区分构建产物(带哈希)与未哈希资源:
map $uri $static_expires {
default "1h";
~*^/static/js/app\.[0-9a-f]{8,}\.js$ "1y";
~*^/static/css/main\.[0-9a-f]{8,}\.css$ "1y";
~*^/images/icons/ "7d";
}然后在对应 location 中:
location /static/ {
alias /var/www/static/;
expires $static_expires;
}验证与调试技巧
检查是否生效:
– 用 curl -I 查看 Expires 和 Cache-Control 响应头;
– 在配置中临时添加 add_header X-Expires-Used $expires_time; 辅助调试;
– 注意浏览器开发者工具可能显示“from memory cache”,需禁用缓存(Network 面板勾选 Disable cache)重新请求。










