软件技术学习笔记

个人博客,记录软件技术与程序员的点点滴滴。

Nginx中配置Cache-Control

Nginx默认配置只给文件生成ETag,没有添加Cache-Control相关的控制,造成Chrome浏览器默认当作永久缓存(除了在地址栏输入URL跳转时,才重新使用ETag校验)。

单页面应用网站的静态资源长期缓存策略:

  1. 主页index.html每次使用ETag校验。
  2. 其余资源(CSS/JS/Images等),根据其内容取HASH值提供唯一的URL路径。

但是,静态Blog网站一般都是很多个页面,且一篇Blog需确保URL地址不变,所以,需要使用不同的缓存控制策略。

静态Blog的Nginx缓存配置

先在 /etc/nginx/mime.types 中添加新字体文件的MIME类型:

  font/woff                             woff;
  font/woff2                            woff2;

  #application/font-woff                 woff;

然后,在Nginx配置文件/etc/nginx/sites-enabled/your-site的http上下文中,定义每种内容类型的缓存时间:

  # Expires map
  map $sent_http_content_type $blog_expires {
    default                    epoch;
    text/html                  epoch;
    text/xml                   epoch;
    text/css                   7d;
    application/javascript     7d;
    application/font-woff      30d;
    application/octet-stream   30d;
    ~font/                     30d;
    ~image/                    30d;
  }

最后,在Nginx配置文件的http、server或location上下文中,添加缓存控制。如下,在Blogs日期开头的页面使用3天缓存,其余页面使用ETag校验,其余内容使用上面的$blog_expires:

  # Cache control
  expires $blog_expires;

  # blogs, such as '/2019/10/abc/index.html'
  location ~* ^(/en)?/\d\d\d\d/\d\d?/.+/(index\.html)?$ {
    expires 3d;
    try_files $uri $uri/ =404;
  }

  location / {
    # First attempt to serve request as file, then
    # as directory, then fall back to displaying a 404.
    try_files $uri $uri/ =404;
  }

参考: http://nginx.org/en/docs/http/ngx_http_headers_module.html#expires