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


我正在使用nginx来处理我的静态内容,有没有办法可以为符合特定规则的每个文件设置expires头?例如,我可以为所有扩展名为“.css”的文件设置expires标头吗?


85
2018-06-10 07:19






答案:


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

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

112
2017-11-25 21:07



添加后我找不到所有静态文件。 - Jürgen Paul
@JackSpairow:我无法解释为什么会这样,因为它一直对我有用。你在运行Nginx缺少add_header提供模块吗?这种事情的范围确实有限,你确定另一个减速不是组合的问题吗? - J. M. Becker
可能另一个块有静态文件的定义 root 设置,在这种情况下,您应该将指令添加到该块。 (我知道这已经晚了2年,但对未来的公民来说) - aularon
我个人非常感谢澄清,特别是对于未来的搜索者,因为他们经常出现在原始帖子后很久。 +1:P - J. M. Becker
使用这个完全搞砸了我的wordpress网站。 css和图像不显示。某处还有其他冲突吗? - user1641443


server {
    ...

    location ~* \.css$ {
       expires 30d;
    }
    ...
}

location 指示

expires 指示


21
2018-06-10 07:23





我没有足够的声誉评论为什么接受的答案会导致文件不再显示,但我想出来并想帮忙!

精简版:

如果没有全局集,请确保在映像上为您的位置块指定了根目录!

长版本如下:


首先,我实现此解决方案的方法非常类似于 这个答案,你在哪里写规则(如在接受的答案中):

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

到一个文件 IMG-cache.conf

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

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

 #Image Caching
 include /etc/nginx/conf/img-cache.conf;

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


其次,我有一个情况,我的/ 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;
}

12
2018-01-31 21:43



+1使这个可重用 .conf。适当的文件夹 nginx/1.14.0 (Ubuntu) 似乎是 /etc/nginx/snippets/。 - Jan Werkhoven


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

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

9
2018-06-10 08:41



我只在server {}块中使用root指令,当在子位置使用它时会导致意外后果。你不需要休息;或者,因为你不在if {}块中 - Dave Cheney
你是对的。忘了清理它。编辑反映这一点。 - Jauder Ho


所有上述解决方案都将否认为不同路径具有不同别名的可能性。另外,为了在一个地方拥有所有不同的缓存到期,您应该以下列方式使用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;
   }
...
}

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

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

更多关于nginx地图的信息 http://nginx.org/en/docs/http/ngx_http_map_module.html


2
2018-01-04 19:58



请注意,如果 $sent_http_content_type 是 "text/css;charset=UTF-8" 上面的表达式会失败。 - pachanka


如果你有一个地方是所有静态文件的家,那么这样的事情就会......

 location /static {
            your/location/to/static/files/static;
            expires 30d;
            add_header Cache-Control "public";
    }

接受的答案导致nginx找不到我的任何静态文件。不确定为什么,但这是一个简单的替代方案。


0
2018-02-25 03:12





由于这是一个非常老的线程,我发现了一个最新的惊人教程。

也许你想看看它

如何在Ubuntu 16.04上使用Nginx的头模块实现浏览器缓存


-1
2018-05-04 04:18



一般来说,我们不赞成链接到文章,也不包括这里的内容,因为链接有变化或过期的倾向。 - Unkwntech