AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 23157
Accepted
Unkwntech
Unkwntech
Asked: 2009-06-10 23:19:43 +0800 CST2009-06-10 23:19:43 +0800 CST 2009-06-10 23:19:43 +0800 CST

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

  • 772

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

nginx http-headers
  • 8 8 个回答
  • 180065 Views

8 个回答

  • Voted
  1. Best Answer
    J. M. Becker
    2011-11-26T13:07:20+08:002011-11-26T13:07:20+08:00

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

    location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
        expires 30d;
        add_header Pragma public;
        add_header Cache-Control "public";
    }
    
    • 140
  2. Dave Cheney
    2009-06-10T23:23:53+08:002009-06-10T23:23:53+08:00
    server {
        ...
    
        location ~* \.css$ {
           expires 30d;
        }
        ...
    }
    

    该location指令

    该expires指令

    • 23
  3. amurrell
    2014-02-01T13:43:39+08:002014-02-01T13:43:39+08:00

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

    精简版:

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

    长版如下:


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

    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;
    }
    
    • 22
  4. Jauder Ho
    2009-06-11T00:41:46+08:002009-06-11T00:41:46+08:00

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

    # Set css and js to expire in a very long time
    location ~* ^.+\.(css|js)$ {
        access_log off;
        expires max;
    }
    
    • 9
  5. Pantura
    2018-01-05T11:58:33+08:002018-01-05T11:58:33+08:00

    所有上述解决方案都将否认不同路径具有不同别名的可能性。此外,为了将所有不同的缓存过期时间集中在一个地方,您应该按以下方式使用 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/ 匹配任何图像类型。

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

    • 8
  6. user161646
    2013-02-25T19:12:31+08:002013-02-25T19:12:31+08:00

    如果您有一个存放所有静态文件的地方,那么这样的事情就可以了...

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

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

    • 2
  7. Jesse Nickles
    2022-09-02T01:07:19+08:002022-09-02T01:07:19+08:00

    此页面上的大多数答案都非常过时和/或令人费解......

    对于初学者来说,现在Expires标头不是一个好的选择,Pragma标头也不是……理想情况下,您应该在Nginx 配置中禁用这两个标头。

    more_clear_headers "Pragma Expires";
    

    Cache-Control在静态资产位置块上设置单个标题要干净得多:

    location ~* \.(atom|bmp|bz2|css|doc|docx|eot|gif|gz|ico|jpeg|jpg|js|mid|midi|mp4|ogg|ogv|otf|png|ppt|rar|rss|rtf|svg|svgz|tar|tgz|ttc|ttf|wav|webp|woff|woff2|xls|zip)$ {
        add_header Cache-Control "public, max-age=691200";
    }
    

    请记住,对于 Nginx,如果您使用expires诸如此类的指令,它expires max不仅会设置 HTTPExpires标头,还会设置Cache-Control标头,因此它会很快变得非常混乱。

    TLDR 仅用于Cache-Control您的静态文件,以便像 Cloudflare 这样的 CDN 可以在边缘缓存它们和/或浏览器可以缓存它们一段时间。

    我建议不要在 WordPress 等动态网站上为您的页面/HTML 内容使用任何缓存标头,因为它只会导致冲突和混乱……如果您真的想要,您可以只etag为您的页面使用 an,但我个人不这样做't 并且认为在使用像 Varnish 或 Litespeed 的 LS Cache 之类的激进输出缓存时,这些更有意义。

    上述方法是我们在SlickStack中使用的方法,它在性能和稳定性方面非常出色,同时可以防止例如 WordPress 插件(或人)弄乱您的设置。

    • 0
  8. Mo Kawsara
    2017-05-04T20:18:15+08:002017-05-04T20:18:15+08:00

    Step1:配置 Cache-Control 和 Expires 标头:

    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
    

    资料来源:数字海洋

    • -1

相关问题

  • 哪个最适合 Django?Lighttpd 还是 Nginx?或者也许是别的什么?[关闭]

  • nginx HTTPS 服务与 HTTP 相同的配置

  • nginx 工作进程的数量

  • 使用Passenger时使用Nginx over Apache with Rails的优缺点是什么

  • 阿帕奇的替代品

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve