为从 nginx 提供的静态内容设置过期标头

Unk*_*ech 112 nginx cache

我正在使用 nginx 来为我的静态内容提供服务,有没有办法为每个满足特定规则的文件设置过期标头?例如,我可以为所有扩展名为“.css”的文件设置 expires 标头吗?

J. *_*ker 141

除了一些更多的文件扩展名之外,我更喜欢做一个更完整的缓存头。这 '?' 前缀是“非捕获”标记,nginx 不会创建 $1。它有助于减少不必要的负载。

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}
Run Code Online (Sandbox Code Playgroud)

  • 可能另一个块定义了带有“root”集的静态文件,在这种情况下,您应该将指令添加到该块中。(我知道这晚了 2 年,但对于未来的公民) (29认同)
  • 添加后没有找到我所有的静态文件。 (8认同)

Dav*_*ney 23

server {
    ...

    location ~* \.css$ {
       expires 30d;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

location指令

expires指令


amu*_*ell 21

我没有足够的声誉来评论为什么接受的答案会导致文件不再显示,但我想通了,并愿意提供帮助!

精简版:

如果您没有全局设置,请确保为图像上的位置块指定了一个根目录!

长版如下:


首先,我实现此解决方案的方法与此答案非常相似,您在其中编写规则(如已接受的答案中所示):

location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Pragma public;
    add_header Cache-Control "public";
}
Run Code Online (Sandbox Code Playgroud)

进入文件img-cache.conf

然后将该文件包含到您的server {...}指令中。

我的网站可用文件夹中的 somesite.com 示例:

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;
Run Code Online (Sandbox Code Playgroud)

这样您就可以将图像缓存位置块添加到您可能正在运行的多个站点。


其次,我有一种情况,我的 /var/www/ 包含两个我允许作为 public_html 的文件夹 - 安全和培训,所以我必须在我的站点的服务器指令中创建特定的位置块,以挑出这些文件夹。

因此,我没有设置全局根目录

因此,当您制作图像位置块时,您可能没有为它们提供用于查找图像的根目录

我的解决方案是:

location ~ ^/training.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}

location ~ ^/.+\.(?:ico|css|js|gif|jpe?g|png)$ {
        root /var/www/secure;
        expires 7d;
        add_header Pragma public;
        add_header Cache-Control "public";
        try_files $uri 404;
}
Run Code Online (Sandbox Code Playgroud)

  • +1 使其成为可重用的`.conf`。`nginx/1.14.0 (Ubuntu)` 中的适当文件夹似乎是 `/etc/nginx/snippets/`。 (2认同)

Jau*_* Ho 9

您还可以将到期时间设置为最大值。这是我用于 css 和 js 的指令。

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}
Run Code Online (Sandbox Code Playgroud)


小智 8

所有上述解决方案都将否认不同路径具有不同别名的可能性。此外,为了将所有不同的缓存过期时间集中在一个地方,您应该按以下方式使用 nginx 映射。

...

# Expires mappings
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     7d;
    ~image/                    max;
}

...

server {
   listen ...;

   expires $expires;
   location /assets/ {
      # It is now possible to serve some resources from different path
      alias /var/www/my_other_path/
   }

   # and have them all have same expirations
   location / {
       try_files $uri $uri/ /index.html;
   }
...
}
Run Code Online (Sandbox Code Playgroud)

Off禁用缓存,epoch(对于 unix epoch)导致资源总是被重新获取,max将日期设置为浏览器最大值。

~image/ 匹配任何图像类型。

有关 nginx 地图的更多信息,请访问http://nginx.org/en/docs/http/ngx_http_map_module.html