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

#1 楼

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

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


评论


添加完之后,找不到我的所有静态文件。

–于尔根·保罗(JürgenPaul)
2012年5月31日0:45

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

– J. M. Becker
2012年5月31日17:26

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

– aularon
2014年7月5日在23:36

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

– J. M. Becker
2014年7月21日在18:14



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

–user1641443
15年4月27日在10:57

#2 楼

server {
    ...

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


location指令

expires指令

#3 楼

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

简短版本:

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

以下的长版:


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

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使它成为可重用的.conf。 nginx / 1.14.0(Ubuntu)中的适当文件夹似乎是/ etc / nginx / snippets /。

– Jan Werkhoven
18-10-26在9:57



#4 楼

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

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


评论


我只会在服务器{}块中使用root指令,当在子位置中使用root指令会导致意外的后果。您不需要休息;也可以,因为您不在if {}块中

–戴夫·切尼
09年6月10日在10:47

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

–何J
09年6月11日在1:02

#5 楼

所有前面提到的解决方案将否认对于不同路径具有不同别名的可能性。同样,为了将所有不同的缓存过期都保存在一个位置,您应该按以下方式使用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 /匹配任何图像类型。

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

评论


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

–pachanka
18年6月6日在3:56

为了方便起见,以上地图块可以包含在共享conf文件中,然后包含在您拥有的所有站点配置中。

–leetNightshade
20 Sep 9 '20 at 19:46

#6 楼

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

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


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

评论


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

– Miro J.
19年6月7日15:16



#7 楼

步骤1:配置缓存控制和过期标头:
sudo nano /etc/nginx/sites-available/default

server块上方添加以下内容:
# Expires map
map $sent_http_content_type $expires {
    default                    off;
    text/html                  epoch;
    text/css                   max;
    application/javascript     max;
    ~image/                    max;
}

,并在server块中添加此行。 expires $expires;
sudo systemctl restart nginx


评论


通常,由于链接有更改或过期的趋势,因此我们不赞成链接到文章,也不在此处包括内容。

– Unkwntech
17年5月26日在17:21

@Unkwntech我不能同意,我只是更新了答案:)

– Mohamed Kawsara
20年7月10日在6:29

最好将地图块添加到conf文件中,然后将其包含在站点配置中。

–leetNightshade
20 Sep 9 '20 at 19:45

很高兴知道,如果您可以编辑我的答案或告诉我如何操作,我将不胜感激。

– Mohamed Kawsara
20/09/10在21:12