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
相关产品推荐
相关产品推荐

