You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署Django应用时,启用Nginx Cache-Control后无法提供缓存数据

解决Nginx添加Cache-Control后静态资源无法访问的问题

你的问题核心是Nginx的location匹配优先级冲突:正则匹配(~*前缀)的优先级高于普通前缀匹配。当请求/static/或/media/目录下的svg/ico/woff等文件时,会优先命中那个单独的正则location,但这个location里没有指定资源的实际路径(root/alias),导致Nginx找不到文件返回错误。

下面是几种可行的解决方法:

方法一:合并缓存规则到静态资源location(最推荐)

既然这些需要缓存的资源都在/static/和/media/目录下,直接在对应的location里添加缓存配置即可,无需单独写正则location:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /app/;

    location / {
        proxy_pass http://landing_page;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    location /static/ {
        alias  /app/staticfiles/;
        try_files $uri $uri/ ;
        # 添加缓存规则
        expires 1M;
        add_header Cache-Control "public";
    }

    location /media/ {
        alias  /app/media/;
        try_files $uri $uri/ ;
        # 如果media目录下的这些文件也需要缓存,取消下面两行注释
        # expires 1M;
        # add_header Cache-Control "public";
    }
}

方法二:提升静态资源location的匹配优先级

给/static/和/media/的location加上^~修饰符,让前缀匹配的优先级高于正则匹配,确保这些目录下的资源优先被正确处理:

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /app/;

    location / {
        proxy_pass http://landing_page;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

    # 加^~提升优先级
    location ^~ /static/ {
        alias  /app/staticfiles/;
        try_files $uri $uri/ ;
    }

    # 加^~提升优先级
    location ^~ /media/ {
        alias  /app/media/;
        try_files $uri $uri/ ;
    }

    # 现在这个正则location只会匹配不在/static和/media下的目标文件
    location ~* \.(svg|ico|woff|woff2|ttf)$ {
        # 如果有其他路径的这些文件,需要指定root/alias
        # root /path/to/other/files;
        expires 1M;
        add_header Cache-Control "public";
    }
}

方法三:给正则location补充路径配置

如果确实需要单独的正则location,要在里面补充资源路径的判断,确保Nginx能找到文件:

location ~* \.(svg|ico|woff|woff2|ttf)$ {
    # 根据请求路径匹配对应的实际目录
    if ($request_uri ~ ^/static/) {
        alias /app/staticfiles/;
    }
    if ($request_uri ~ ^/media/) {
        alias /app/media/;
    }
    expires 1M;
    add_header Cache-Control "public";
}

注意:Nginx里的if指令要谨慎使用,仅在必要时采用这种方式。

内容的提问来源于stack exchange,提问作者kazem qanati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 00:25:26