it-swarm.cn

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

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

101
Unkwntech

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

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

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

location 指令

expires 指令

22
Dave Cheney

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

简洁版本:

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

下面的长版:


首先,我实现此解决方案的方法实际上与 此答案 相似,您可以在其中编写规则(如公认的答案所示):

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

放入文件img-cache.conf

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

我的“ sites-available”文件夹中的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;
}
19
amurrell

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

# Set css and js to expire in a very long time
location ~* ^.+\.(css|js)$ {
    access_log off;
    expires max;
}
9
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 Epoch)导致资源总是被重新获取,max将日期设置为浏览器最大值。

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

有关 http://nginx.org/en/docs/http/ngx_http_map_module.html 的更多有关nginx映射的信息。

4
Pantura

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

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

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

2
user161646