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 / 问题 / 1091739
Accepted
O'Niel
O'Niel
Asked: 2022-02-01 03:04:13 +0800 CST2022-02-01 03:04:13 +0800 CST 2022-02-01 03:04:13 +0800 CST

将位置块添加到缓存文件会使这些文件返回 404

  • 772

我想使用 Nginx 缓存一些静态文件。但我不知何故无法让它工作。

这是我的nginx.conf:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 768;
    #multi_accept on;
}


http {

    #GZIP
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_types application/javascript application/json application/ld+json application/xml font/eot font/otf font/ttf text/css text/javascript text/plain text/xml;

    # SERVERS
    server {
            listen      80;

        server_name example.com;
        if ($http_host ~* ^www\.(.*)$ )
        {
            return 301 https://$1$request_uri;
        }

        return 301 https://$http_host$request_uri;
    }
    server {
        listen 443 ssl;

        if ($http_host ~* ^www\.(.*)$ )
        {
            return 301 $scheme://$1$request_uri;
        }


        #SSL
        ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
        ssl_certificate_key /root/.acme.sh/example.com/example.com.key;

        server_name example.com;

        # Pass all traffic to my webapplication
        location / {
            proxy_set_header Host $host;
            proxy_pass http://localhost:8080;
        }

        #Browser caching
        location ~* \.(js|css)$ {
            expires 180d;
            add_header Pragma "public";
            add_header Cache-Control "public";
        }
        location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
            expires 365d;
            add_header Pragma "public";
            add_header Cache-Control "public";
        }

    }
}

问题出在“浏览器缓存”部分。启用此代码块时,我的网站会加载,但所有 css 文件、javascript 文件和图像都返回 404。就像这些文件忽略了我的location /.

我能够通过复制/粘贴来解决这个问题

proxy_set_header Host $host;
proxy_pass http://localhost:8080;

在我所有的location块中,但这并不是很优雅,实际上让我的网站感觉慢了很多......

我还尝试将location浏览器缓存的两个块移动到块中location \,以便后者充当“父级”。但这并没有机会图像等的行为返回 404。

如何在 Nginx 中配置静态文件的缓存?

编辑: 我将以下内容添加到我的http-block 中:

  map $uri $cache_control {
                ~/Website/assets/media/images    "public, no-transform";
        }
        map $uri $expire {
            ~/Website/assets/media/images   365d;
        }

在我的server-block 中添加了以下内容:

 expires $expire;
                add_header Cache-Control $cache_control;

没有任何东西被缓存。

cache nginx
  • 2 2 个回答
  • 234 Views

2 个回答

  • Voted
  1. Tero Kilkanen
    2022-02-01T14:19:05+08:002022-02-01T14:19:05+08:00

    这实际上并没有回答您的问题,而是显示了使用 nginx 提供静态资产的首选方式。

    由于您似乎在同一主机上运行 Web 应用程序,因此我建议您直接使用 nginx 提供静态文件。

    root /path/to/webroot;
    
    location ~* \.(js|jss)$ {
        expires 180d;
        add_header Pragma "public";
        add_header Cache-Control "public;
    
        try_files $uri =404;
    }
    
    location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
        expires 365d;
        add_header Pragma "public";
        add_header Cache-Control "public";
    
        try_files $uri =404;
    }
    

    这个仍然有重复的缓存定义。include您可以通过在单独的文件中指定指令并使用将文件包含在配置中来消除一些重复。

    您将输入以下内容进行proxy_header.conf归档:

    add_header Pragma "public";
    add_header Cache-Control "public";
    

    在您的配置中:

    location ~* ... {
        include /path/to/webroot;
        expires 365d;
    }
    
    • 1
  2. Best Answer
    Ivan Shatsky
    2022-02-09T14:29:40+08:002022-02-09T14:29:40+08:00

    如果您不能像@TeroKilkanen 建议的那样通过 nginx 直接从文件系统提供静态资产,您可以使用类似于此答案中所示的技术:

    map $uri $expire {
        ~\.(?:j|cs)s$                      180d;
        ~\.(?:jpe?g|png|webp|woff2?|ttf)$  365d;
        default                            off;
    }
    map $uri $cache_control {
        ~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$  public;
    }
    server {
        ...
        expires $expire;
        add_header Pragma $cache_control;
        add_header Cache-Control $cache_control;
        ...
    }
    

    如果您的请求 URI 与正则表达式不匹配,则$cache_control变量将具有空值,并且 nginx 根本不会在其响应中添加Pragma和标头。Cache-Control

    • 1

相关问题

  • 缩放大文件下载?

  • Gzip 与反向代理缓存

  • 如何禁用tomcat缓存?我遇到了奇怪的静态文件问题

  • mod_mem_cache 提供错误的内容!

  • NFS 缓存导致间歇性滞后

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

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

    • 9 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

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

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +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