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

Django部署在DigitalOcean Droplet后访问media文件返回403 forbidden错误

媒体文件403错误排查与解决方案

第一步:排查文件系统权限问题

该问题90%以上由文件权限不匹配导致

  • 先确认Nginx运行用户:执行ps aux | grep nginx,输出第一列即为Nginx运行用户,Ubuntu环境默认是www-data
  • 再查看media目录及内部文件的属主、权限:执行ls -l /path/to/your/media/,替换为你实际的media目录绝对路径
  • 权限修复操作:
    • 递归修改media目录属主为应用运行用户+Nginx用户组,例如你的Gunicorn用appuser用户运行,命令为sudo chown -R appuser:www-data /path/to/your/media/
    • 递归设置目录和文件的权限阈值:
      sudo find /path/to/your/media/ -type d -exec chmod 750 {} \;
      sudo find /path/to/your/media/ -type f -exec chmod 640 {} \;
      

第二步:排查Nginx配置问题

  • 检查站点配置中media路径的location规则,确认没有配置IP限制、路径错误等问题,参考正确配置如下:
    location /media/ {
        alias /path/to/your/actual/media/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }
    
  • 验证配置合法性:执行sudo nginx -t,返回success后执行重载生效sudo systemctl reload nginx

第三步:排查系统安全模块限制

Ubuntu默认开启AppArmor,可能会限制Nginx读取非默认站点目录的文件

  • 执行sudo aa-status | grep nginx,如果返回enforcing状态,可临时切换为宽松模式验证:sudo aa-complain /usr/sbin/nginx
  • 若使用自定义开启了SELinux的镜像,执行sudo setenforce 0临时关闭验证,确认是该问题后再添加对应目录的访问规则即可

第四步:排查应用层权限拦截

如果上述步骤都无问题,检查应用是否对media路径做了权限校验,例如Django如果配置了全局登录拦截、或者自定义了media路径的访问中间件,会拦截未登录用户的访问,修改应用路由规则放开media路径的公开访问权限即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:48:02