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

Nginx无法正常提供/public/下非/static/路径静态文件问题求助

问题分析与解决方案

不用给每个文件/目录单独写location规则,你的问题出在当前Nginx配置只处理了/static/路径的请求,其他根路径或子目录的静态文件请求都被转发给Gunicorn(Django)处理了,但Django并没有托管这些文件的逻辑,所以返回404。

下面两种通用配置方式可以解决问题:

方式一:在根location中使用try_files

修改location /块,让Nginx先尝试从public目录找对应文件,找不到再转发给Gunicorn:

server {
    server_name mysite.com; # 注意这里要加分号,你原来的配置漏了

    location /static/ {
        autoindex off;
        root /home/myuser/mysite.com/public/;
    }

    location / {
        # 先尝试在public目录找请求的文件,找不到再转发给Gunicorn
        try_files $uri $uri/ @proxy_to_django;
    }

    # 定义转发到Django的规则
    location @proxy_to_django {
        proxy_pass http://localhost:8001;
        proxy_set_header Host $host;
    }
}

这样,当访问mysite.com/robots.txt时,Nginx会先去/home/myuser/mysite.com/public/robots.txt找文件;访问mysite.com/bookmarks/bookmarks.html时,会去/home/myuser/mysite.com/public/bookmarks/bookmarks.html找,找到就直接返回,找不到才转发给Django处理。

方式二:配置通用静态资源location块

另一种方式是新增一个location,匹配所有非/static/的静态文件请求,优先从public目录读取:

server {
    server_name mysite.com;

    location /static/ {
        autoindex off;
        root /home/myuser/mysite.com/public/;
    }

    # 匹配根路径和子目录的静态文件,优先从public目录读取
    location ~* ^/(robots\.txt|favicon\.ico|bookmarks/.*)$ {
        root /home/myuser/mysite.com/public/;
    }

    location / {
        proxy_pass http://localhost:8001;
        proxy_set_header Host $host;
    }
}

这种方式更灵活,可以精确指定要匹配的文件或目录,比如上面的正则匹配了robots.txt、favicon.ico和bookmarks/下的所有内容。如果需要新增其他文件或目录,直接在正则里添加即可。

注意事项

  • 别忘了给server_name行末尾加分号,你原来的配置里漏了,这属于语法错误,可能导致Nginx无法正常启动。
  • 如果public目录下有很多不同类型的静态文件,方式一的try_files更省心,不用逐个添加规则;如果只想指定特定文件/目录,方式二更精准。

内容的提问来源于stack exchange,提问作者Jonah Bishop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:12:46