如何配置 map 指令动态设置 expires 实现基于文件后缀的差异化浏览器缓存

浅静大大_9801

浅静大大_9801

2026-05-09

275人浏览

原创

直接用 map 指令按文件后缀设置缓存更清晰易维护,不依赖后端 Content-Type,而是通过 $uri 在请求初期匹配扩展名(如 .js、.jpg)映射缓存时间,HTML 设为 0 或 epoch 禁用,JS/CSS/字体设 1 年,图片设 1 周,需用 ~* 不区分大小写匹配并注意顺序防 default 拦截。

如何配置 map 指令动态设置 expires 实现基于文件后缀的差异化浏览器缓存

直接用 map 指令按文件后缀设置缓存,比写一堆 location 块更清晰、更易维护,关键是它不依赖后端返回的 Content-Type,而是从请求路径本身判断类型,适合纯静态服务或构建产物已带哈希的场景。

核心思路:用 $uri 匹配后缀,映射缓存时间

不同于基于 $sent_http_content_type 的方式(需等响应头生成),这里在请求刚进来时就根据 URL 路径决定缓存策略,响应前就确定 expires 值。

  • 在 http 块中定义 map,用正则匹配 $uri 的扩展名
  • 为常见后缀分配合理过期时间:HTML 禁用、JS/CSS/字体设 1 年、图片设 1 周或 1 月
  • 在 server 或 location 中直接调用该变量:expires $expires_by_ext;

推荐配置示例

以下配置覆盖主流静态资源,兼顾安全与性能:

http {
    map $uri $expires_by_ext {
        default                    "epoch"; # 默认不缓存
        ~*\.(html|htm|php|xml)$    "0";     # HTML 类动态内容,强制不缓存
        ~*\.(js|css|woff2?|ttf|eot|svg|otf)$ "1y";
        ~*\.(jpg|jpeg|png|gif|webp|avif)$   "1w";
        ~*\.(ico|cur)$                       "1m";
    }
<pre class="brush:php;toolbar:false;">server {
    listen 80;
    root /var/www/html;

    location / {
        expires $expires_by_ext;
        # 若需加 immutable(仅限哈希文件),改用 add_header + always
        add_header Cache-Control "public, immutable" always;
    }
}

}

CDP浏览器大师
CDP浏览器大师

CDP浏览器大师:通过Chrome DevTools Protocol驱动已登录浏览器实现自动化任务,解决反爬封号、选择器失效、SPA路由难导航、固定sleep不准四大痛点。核心能力包括UA伪装、WebGL/Canvas指纹混淆、智能等待、动态选择器以及可视化调试。

下载

注意:add_header 的 always 参数确保即使返回 304 或错误码也带上该头;immutable 仅对 URL 含哈希的资源有效,否则会锁死旧版本。

关键细节和避坑点

  • 正则必须加 ~* 表示不区分大小写,避免 .JPG 或 .CSS 不匹配
  • 匹配顺序重要:把具体后缀(如 \.js$)放前面,通配规则(如 \..*$)放最后,否则会被 default 拦截
  • "epoch" 等效于 Expires: Thu, 01 Jan 1970,浏览器立刻失效;"0" 表示 Expires 头设为响应发出时刻,等效 no-cache
  • 若同时用 expires 和 add_header Cache-Control,前者会自动覆盖后者中的 max-age,所以建议统一用 add_header 控制,expires 仅作兼容补充

进阶:结合构建哈希做精准控制

如果项目使用 Webpack/Vite,输出文件带内容哈希(如 main.a1b2c3.js),可进一步细化:

  • 对含哈希的 JS/CSS:设 "1y" + immutable
  • 对不含哈希的同名文件(如 common.js):降级为 "1h" 或 "1d"
  • 用 ~*\.(js|css)(\?.*)?$ 匹配带查询参数的请求,但注意:Nginx 默认不将 query string 用于缓存键,除非显式配置

相关专题

更多
nginx 重启
nginx 重启

nginx重启对于网站的运维来说是非常重要的,根据不同的需求,可以选择简单重启、平滑重启或定时重启等方式。本专题为大家提供nginx重启的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.27

423

5

nginx 配置详解
nginx 配置详解

Nginx的配置是指设置和调整Nginx服务器的行为和功能的过程。通过配置文件,可以定义虚拟主机、HTTP请求处理、反向代理、缓存和负载均衡等功能。Nginx的配置语法简洁而强大,允许管理员根据自己的需要进行灵活的调整。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

4087

6

nginx配置详解
nginx配置详解

NGINX与其他服务类似,因为它具有以特定格式编写的基于文本的配置文件。本专题为大家提供nginx配置相关的文章,大家可以免费学习。

2023.08.04

6945

6

tomcat和nginx有哪些区别
tomcat和nginx有哪些区别

tomcat和nginx的区别:1、应用领域;2、性能;3、功能;4、配置;5、安全性;6、扩展性;7、部署复杂性;8、社区支持;9、成本;10、日志管理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.02.23

601

5

nginx报404怎么解决
nginx报404怎么解决

当访问 nginx 网页服务器时遇到 404 错误,表明服务器无法找到请求资源,可以通过以下步骤解决:1. 检查文件是否存在且路径正确;2. 检查文件权限并更改为 644 或 755;3. 检查 nginx 配置,确保根目录设置正确、没有冲突配置等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.07.09

1516

5

Nginx报404错误解决方法
Nginx报404错误解决方法

解决方法:只需要加上这段配置:try_files $uri $uri/ /index.html;即可。想了解更多Nginx的相关内容,可以阅读本专题下面的文章。

2024.08.07

3998

3

nginx部署php项目教程汇总
nginx部署php项目教程汇总

本专题整合了nginx部署php项目教程汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

122

12

nginx配置文件详细教程
nginx配置文件详细教程

本专题整合了nginx配置文件相关教程详细汇总,阅读专题下面的文章了解更多详细内容。

2026.01.13

557

23

Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建
Nginx跨平台安装实操指南:Windows、macOS与Linux环境快速搭建

本指南详解Nginx在Windows、macOS及Linux系统的安装全流程。涵盖官方包解压、Homebrew一键部署、APT/YUM源配置及Docker容器化方案。无论新手或开发者,均可快速搭建运行环境,掌握跨平台核心指令,为后续配置与调优奠定坚实基础。

2026.03.16

179

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程