如何在nginx中为某些文件扩展名添加带有代理传递的缓存控制头

如何在nginx中为某些文件扩展名添加带有代理传递的缓存控制头,nginx,nginx-reverse-proxy,cache-control,nginx-config,Nginx,Nginx Reverse Proxy,Cache Control,Nginx Config,我喜欢使用nginx为一些扩展添加缓存控制头,如.jpg等,但到目前为止,我在网上找到的一些解决方案,我无法让它工作。我会告诉你我试过什么 我在我的站点的.conf文件中的不同位置尝试了以下内容的变体,当我尝试该站点时,该站点变为空白,我在控制台上发现了大量404错误。该站点是在React中开发的 location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 1d; add_header Cache-Control "pu

我喜欢使用nginx为一些扩展添加缓存控制头,如.jpg等,但到目前为止,我在网上找到的一些解决方案,我无法让它工作。我会告诉你我试过什么

我在我的站点的.conf文件中的不同位置尝试了以下内容的变体,当我尝试该站点时,该站点变为空白,我在控制台上发现了大量404错误。该站点是在React中开发的

location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
    expires 1d;
    add_header Cache-Control "public, no-transform";
}
我的conf文件如下所示。问题是我必须做反向代理,因为这些站点实际上托管在Docker容器中

 server {
    server_name mysite.net;
    root         /usr/share/nginx/html;

    location / {
        proxy_pass http://web:3005/;
    }

    location /api/ {
        rewrite ^/api(/.*)$ $1 break;

        proxy_pass  http://api:5005/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect    off;
        fastcgi_read_timeout 1200;
        proxy_read_timeout 1200;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/mysite.net-0001/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/mysite.net-0001/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

server {
    if ($host = mysite.net) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    server_name mysite.net;
    return 404; # managed by Certbot
}

使用
map
指令:

map$cache$控件{
1“公开,不改造”;
}
映射$cache$过期{
1 1d;
默认关闭;#或其他一些默认值
}
映射$uri$缓存{
~*\(js | css | png | jpe | g | gif | ico)$1;
}
服务器{
...
过期$expires;
添加_头缓存控制$Control;
...
}
(您还可以将
expires
add_header
指令放入
location
上下文,甚至可以在
http
上下文中退出)。如果通过
$control
变量的映射表达式计算的值为空字符串,nginx将不会添加标题(或修改现有标题)。这不是唯一可能的解决方案,您还可以依赖上游的
内容类型
响应标题(参见答案以获取示例)

您应该了解文档摘录:

可能有几个
add_header
指令。当且仅当当前级别上未定义
add_header
指令时,这些指令才会从上一配置级别继承


嘿,它起作用了。非常感谢。长期以来,我们一直在寻找有效的解决方案。