NGINX在尝试缓存静态文件时返回404

doinxwow  于 2023-10-17  发布在  Nginx
关注(0)|答案(1)|浏览(119)

问题:

当我尝试将缓存逻辑添加到我的NGINX服务器.conf文件时,所有静态资产都会收到一个404

目标:

我想通过NGINX缓存/static/* 文件目录中的特定文件类型。我想这些头告诉客户端(浏览器)缓存本地静态文件。

上下文:

在这个例子中,我将使用www.example.com而不是我自己的域。
我有两个Docker容器,它们彼此知道。一个是接收Web连接的NGINX服务器。另一个是Flask容器,它进行后端处理并使用JINJA创建动态HTML模板。
NGINX容器有一个名为/static的文件夹,其中包含.css、.js、.png、.jpg等文件。/static文件夹结构如下所示:

/静态文件结构

/static    
        ├── /assets
        │   └── sitemap.xml
        │   └── otherfiles...
        └── /img
        │   └── images...
        └── /js
        │   └── jsFiles...
        └── /css
        │   └── cssFiles...

**Nginx配置- * 工作 *

server{
        listen 80;
        server_name <www.example.com>;
        return 301 <https://www.example.com>$request_uri;
}

server {

    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;

    listen 443 http2 ssl;
    server_name <www.mydomain.com>;
    ssl_certificate <certpath>
    ssl_certificate_key <privatekeypath>

    large_client_header_buffers 4 16k;

    location / {
        proxy_pass http://flask-app-docker:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /robots.txt {
    add_header Content-Type text/plain;
    return 200 "User-agent: *\nAllow: /\nSitemap: https://<www.example.com>/sitemap.xml";
    }

    location /sitemap.xml {
        add_header Content-Type application/xml;
        try_files $uri /static/assets/sitemap.xml;
    }

    location /static {
        rewrite ^/static(.*) /$1 break;
        root /static;
    }
}

**NGINX配置- Broken

server{
        listen 80;
        server_name <www.example.com>;
        return 301 <https://www.example.com>$request_uri;
}

server {

    modsecurity on;
    modsecurity_rules_file /etc/nginx/modsec/main.conf;

    listen 443 http2 ssl;
    server_name <www.mydomain.com>;
    ssl_certificate <certpath>
    ssl_certificate_key <privatekeypath>

    large_client_header_buffers 4 16k;

    # ------ Start of caching section which breaks things ------
    location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Vary Accept-Encoding;
    access_log off;
    }
    # ----------------------------------------------------------

    location / {
        proxy_pass http://flask-app-docker:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /robots.txt {
    add_header Content-Type text/plain;
    return 200 "User-agent: *\nAllow: /\nSitemap: https://<www.example.com>/sitemap.xml";
    }

    location /sitemap.xml {
        add_header Content-Type application/xml;
        try_files $uri /static/assets/sitemap.xml;
    }

    location /static {
        rewrite ^/static(.*) /$1 break;
        root /static;
    }
}

Nginx配置- DIFF

以下是添加到文件中并中断的行:

# ------ Start of caching section which breaks things ------
    location ~* \.(?:ico|css|js|gif|jpe?g|png)$ {
    expires 30d;
    add_header Vary Accept-Encoding;
    access_log off;
    }
    # ----------------------------------------------------------

编辑11/9/2020仍然无法根据结束文件扩展名获得缓存工作。然而,我设法找到了一个解决办法,将静态文件放在它们自己的文件夹中,然后在所有文件上设置缓存头。

更新了上面示例中的/static位置块,如下所示。我可能最终会更新这是答案,因为它是工作,即使它不是完美的解决方案或答案,我正在寻找。

location /static {
        root /static;
        expires 30d;
        add_header Vary Accept-Encoding;
    }
zzlelutf

zzlelutf1#

我也面临着同样的问题。一般来说,location /部分将提供HTML及其静态文件。现在,我们正在为要缓存的特定文件类型添加另一个位置部分。在这种情况下,您需要设置根文件夹,其中基本上包含HTML和静态文件。在我的例子中,root /root/yourapp/dist;是文件夹路径。

location ~* \.(jpg|jpeg|gif|png|ico|svg)$ {
     root /root/yourapp/dist;
     expires 30d;
     add_header Pragma "public";
     add_header Cache-Control "public";
    }
location / {
      root /root/yourapp/dist;
      index  index.html index.htm;
      try_files $uri $uri/ /index.html;
      expires 30d;
    }

相关问题