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

NGINX反向代理Apache2部署Django 重定向及静态路径错误

问题根因

Django默认以站点根路径/作为自身的应用根路径,当前反向代理配置未向后端传递子路径挂载信息,Django侧也未配置对应前缀参数,导致所有路由反向生成、重定向返回、静态资源寻址逻辑全部丢失/systems3前缀,最终出现路径跳转越权、静态资源404的问题。

修复方案

分NGINX代理层、Django应用层两处修改即可,不需要调整原有Apache2+mod_wsgi的部署配置(直连访问正常说明后端服务本身无问题)。

1. 调整NGINX代理配置

替换原有/systems3的location块配置,核心是补充子路径标识头、修正路径转发和重定向规则,新增静态资源匹配规则:

location /systems3 {
    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 SCRIPT_NAME /systems3;
    # 末尾带斜杠,转发时自动剥离/systems3前缀,后端收到的路径和直连时完全一致
    proxy_pass https://systems3.slt.local/;
    # 自动修正后端返回的重定向Location头,补全子路径前缀
    proxy_redirect https://systems3.slt.local/ /systems3/;
}

# 单独匹配静态资源路径,避免静态请求转发时丢前缀
location /systems3/static/ {
    proxy_pass https://systems3.slt.local/static/;
    proxy_set_header Host $host;
    expires 30d;
}

修改完成后执行nginx -t校验配置语法,无误后重载NGINX服务。

2. 调整Django项目配置

打开项目的settings.py配置文件,新增/修改以下参数:

# 强制Django所有路由生成、重定向逻辑自动携带/systems3前缀
FORCE_SCRIPT_NAME = "/systems3"

# 修正静态资源访问路径前缀,所有{% static %}标签生成的路径会自动拼接前缀
STATIC_URL = f"{FORCE_SCRIPT_NAME}/static/"

# 如果项目用到用户上传的media资源,同步修正前缀
MEDIA_URL = f"{FORCE_SCRIPT_NAME}/media/"

# 修正登录跳转路径,避免硬编码根路径导致跳转异常
LOGIN_URL = f"{FORCE_SCRIPT_NAME}/accounts/login/"

注意:如果项目代码里存在硬编码的绝对路径跳转(比如直接写return redirect('/home/')这类写法),需要统一改成用reverse()做路由反向解析,否则这类硬编码路径依然会丢失前缀。

修改完成后重启Apache2服务,让mod_wsgi加载新的Django配置即可。

验证

清理浏览器缓存后访问代理地址https://[你的NGINX域名]/systems3,未登录时会自动跳转到/systems3/accounts/login/路径,页面静态资源请求路径也会自动携带/systems3前缀,两类异常都会消失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 12:27:13