能否用单个域名部署Django后端与多页面React前端?技术咨询
单个域名部署Django后端+多页面React前端的方案解析
1. 能否通过单个域名部署?可行,具体操作分两种常用方案:
方案一:反向代理(以Nginx为例)
这是生产环境最通用的方案,用Nginx作为统一入口,按路径转发请求到不同服务:
- 先执行
npm run build打包React项目,把生成的静态文件上传到服务器指定目录(比如/var/www/react-dist); - 用Gunicorn或uWSGI启动Django服务,让它运行在本地端口(如
127.0.0.1:8000); - 配置Nginx,将根路径
/的请求指向React静态文件,/api/路径的请求转发到Django服务。示例配置:
server { listen 443 ssl; server_name your-domain.com; # 此处添加SSL证书配置(生产环境必须启用HTTPS) # 处理React多页面请求:按实际页面路径匹配对应HTML文件 location / { root /var/www/react-dist; try_files $uri $uri.html $uri/ /index.html; } # 转发Django API请求 location /api/ { proxy_pass http://127.0.0.1:8000/; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } }
方案二:Django直接托管React静态文件
如果不想额外配置反向代理,可以让Django同时处理API和前端资源:
- 把React打包后的所有文件(各页面HTML、css、js等)放到Django的
templates和static目录; - 修改Django的URL配置,让前端页面路径返回对应React HTML文件,
/api/路径处理后端接口。示例urls.py:
from django.urls import path, include from django.views.generic import TemplateView from . import api_urls urlpatterns = [ # 挂载API路由 path('api/', include(api_urls)), # 匹配多页面路径:比如/about返回about.html path('about/', TemplateView.as_view(template_name='about.html')), path('products/', TemplateView.as_view(template_name='products.html')), # 根路径返回首页 path('', TemplateView.as_view(template_name='index.html')), ]
- 注意:需在Django的
settings.py中配置好TEMPLATES和STATIC_ROOT,确保能正确读取React的静态资源。
2. 后端API是否会暴露?
会暴露,但这是前端调用API的必然结果——前端需要通过域名下的API路径(如your-domain.com/api/user)发起请求,这些路径本身就是对外可见的。
不过可以通过以下方式降低安全风险:
- 强制HTTPS:所有请求走HTTPS,避免API数据被明文窃取;
- 添加认证机制:给API接口加上JWT、Session或OAuth2认证,确保只有合法用户能访问敏感接口;
- 配置CORS:用
django-cors-headers库设置CORS策略,只允许当前域名的前端请求访问API; - 请求限流:通过
django-ratelimit或Nginx规则限制API请求频率,防止恶意攻击; - 隐藏敏感信息:API返回结果只包含前端需要的业务字段,绝不泄露数据库密码、密钥等敏感数据。
内容的提问来源于stack exchange,提问作者user22257988
相关产品推荐
相关产品推荐

