为 Nginx 提供的静态内容设置“Expires”HTTP 标头?

为 Nginx 提供的静态内容设置“Expires”HTTP 标头?

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

答案1

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

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

答案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";
}

放入一个文件中图片缓存配置文件

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

我的 sites-available 文件夹中的 somesite.com 示例:

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

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


其次,我遇到的情况是,我的 /var/www/ 包含两个我允许作为 public_html 的文件夹 - secure 和 training,因此我必须在网站的服务器指令中创建特定的位置块来单独列出这些文件夹。

像这样,我没有设置全局根目录

因此,当你制作图像位置块时,你可能没有向他们提供根目录从中寻找图像!

我的解决方案是:

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

答案4

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

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

相关内容