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


96

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

Answers:


126

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

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

7
添加完之后,找不到我的所有静态文件。
尔根·保罗(

@JackSpairow:我真的不能解释为什么会这样,因为它一直对我有用。您是否正在运行Nginx缺少add_header提供模块?这种事情真的是范围有限的,您确定结合另一个减速不是问题吗?
JM Becker

24
可能另一个块为静态文件定义了一root组,在这种情况下,您应该将指令添加到该块中。(我知道这是迟到的2年,但对于未来的公民来说)
aularon 2014年

1
我个人很欣赏这些说明,尤其是对于将来的搜索者,因为它们经常出现在原始帖子之后很长时间。+1:P
JM Becker 2014年

使用这个完全弄乱了我的wordpress网站。CSS和图像未显示。还有其他冲突吗?
user1641443 2015年


17

我没有足够的声誉来评论为什么接受的答案将导致文件不再显示,但我想出了办法,并希望为您提供帮助!

简洁版本:

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

下面的长版:


首先,我实现此解决方案的方法实际上与以下答案类似,您可以在其中编写规则(如已接受的答案):

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;
}

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

9

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

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

1
我只会在服务器{}块中使用root指令,在子位置中使用它会导致意外的后果。您不需要休息;要么,因为您不在if {}区块中
Dave Cheney

你是对的。忘记清理了。编辑以反映这一点。
2009年

4

所有上述解决方案都将否认为不同路径使用不同别名的可能性。同样,为了将所有不同的缓存过期都放在一个位置,您应该通过以下方式使用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


请注意,如果$sent_http_content_type为,"text/css;charset=UTF-8"则上述表达式将失败。
pachanka

2

如果您有一个存放所有静态文件的地方,则可以执行以下操作...

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

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


我对此票投了赞成票,但确保将/static文件夹(无论您在位置中设置了什么)添加到别名的末尾(.../files在示例中紧随其后)。
Miro J.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.