Django+DRF+Docker+Nginx部署时媒体文件返回URL异常问题咨询
解决方案
问题核心是经过两层Nginx反向代理后,Django服务无法获取到用户真实请求的域名、协议信息,生成媒体URL时使用了内层代理的地址,按以下步骤修改即可:
1. 修改宿主机Nginx站点配置
编辑nginx/sites-enabled/my-api文件,在location /代理块内补充请求头传递配置:
location / { proxy_pass http://127.0.0.1:8337; # 新增以下配置 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 $scheme; proxy_set_header X-Forwarded-Port $server_port; }
修改完成后执行nginx -s reload重载配置生效。
2. 修改Django项目settings配置
在你的DRF项目配置文件中新增/调整以下参数:
# 允许从X-Forwarded-Host头获取真实域名 USE_X_FORWARDED_HOST = True # 识别HTTPS协议标记 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 补充信任的域名,注意替换为你的实际域名 ALLOWED_HOSTS = ['my-domain.com'] # 确认媒体URL配置正确 MEDIA_URL = '/mediafiles/' # Django 4.0+版本需要额外添加CSRF信任源配置 CSRF_TRUSTED_ORIGINS = ['https://my-domain.com']
3. 重启容器服务
重新构建启动web和nginx容器,让Django配置生效:
docker-compose up -d --force-recreate web nginx
修改完成后再次访问接口,user_picture字段就会返回以https://my-domain.com开头的正确URL。
内容的提问来源于stack exchange,提问作者thisfo
相关产品推荐
相关产品推荐

