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

Nginx反向代理Django DRF遇404,API URL缺失端口求助

解决Nginx反向代理下DRF API 404及URL缺失端口问题

问题根源

你遇到的DRF接口404,本质是反向代理后Django/DRF生成的API链接缺少外部访问端口(8080):点击页面上的无端口链接时,请求会默认走80端口,而你的服务监听的是8080,所以返回404;手动添加端口后能访问,说明后端服务本身是正常的,只是URL生成逻辑错误。

修复步骤

1. 调整Nginx配置,传递完整的主机端口信息

修改Nginx配置,让它把外部访问的端口一并传递给Django容器:

upstream django {
    server store:27036;
}

server {
    listen 8080;

    location / {
        proxy_pass http://django;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # 传递包含端口的完整Host头,替代原来的仅$host
        proxy_set_header Host $host:$server_port;
        # 显式传递外部端口给Django
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_redirect off;
    }

    location /static {
        alias /vol/static;
    }
}

2. 配置Django信任反向代理头

在你的生产环境配置my_app.settings.prod中添加以下设置,让Django正确识别反向代理传递的外部请求信息:

# 启用反向代理头支持,让Django使用X-Forwarded-*头生成正确的外部URL
USE_X_FORWARDED_HOST = True

# 如果你的服务使用HTTPS,取消下面的注释;HTTP环境可以忽略
# SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# 确保ALLOWED_HOSTS包含你访问时用的主机(比如127.0.0.1、localhost)
ALLOWED_HOSTS = ['127.0.0.1', 'localhost']  # 也可以保留你原来的环境变量配置

# 确认静态文件根目录配置,对应容器内的挂载路径
STATIC_ROOT = '/vol/web'  # 配合store容器的static_data卷挂载,collectstatic会把静态文件放到这里

3. 重启容器生效

修改配置后,重启相关容器让配置生效:

docker-compose restart nginx store

额外检查

  • 确保已执行静态文件收集:进入store容器运行python manage.py collectstatic --noinput,保证静态文件已同步到Nginx能访问的卷中。
  • 验证ALLOWED_HOSTS:如果访问时用的是其他IP/域名,要加到ALLOWED_HOSTS里,避免Django返回400错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:35:28