问题:
当我尝试将缓存逻辑添加到我的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;
}
1条答案
按热度按时间zzlelutf1#
我也面临着同样的问题。一般来说,
location /
部分将提供HTML及其静态文件。现在,我们正在为要缓存的特定文件类型添加另一个位置部分。在这种情况下,您需要设置根文件夹,其中基本上包含HTML和静态文件。在我的例子中,root /root/yourapp/dist;
是文件夹路径。