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

Nginx location块配置子路径转发Django应用跳转丢前缀解决方法

问题根因

跳转丢失/custom前缀的核心原因是仅在Nginx层做了路径重写,Django服务本身完全感知不到自己被部署在子路径下:Django的路由反向解析、重定向响应、模板内链接生成全默认以根路径/为基准,最终返回给浏览器的页面里所有跳转链接都是/app1这类不带子路径前缀的地址,点击后浏览器直接请求根路径下的路由,自然触发404。

可行配置方案

需要同时调整Django侧和Nginx侧配置,从根源解决路径生成问题,不要仅靠Nginx rewrite硬改入站路径。

  1. 调整Django配置
    编辑项目的settings.py,添加子路径前缀配置,同时修正静态资源路径:
# settings.py
# 告诉Django所有生成的URL统一带上/custom前缀
FORCE_SCRIPT_NAME = '/custom'
# 修正静态资源路径前缀,避免静态资源加载404
STATIC_URL = '/custom/static/'

配置完成后重启Gunicorn/uWSGI等Django运行进程,此时模板内{% url %}标签、redirect()跳转函数生成的所有站内链接都会自动携带/custom前缀,不会再出现路径丢失问题。

  1. 调整Nginx配置
    去掉原来的rewrite规则,用更规范的proxy_pass路径转发写法,同时匹配子路径下的静态资源请求,增加重定向兜底修正规则:
upstream django_app {
  server django_app:8000;
}

server {
  listen 80;
  listen [::]:80;
  server_name demo.company.com;

  # 匹配子路径下的静态资源请求
  location /custom/static/ {
    alias /var/www/static/;
  }

  location /custom/ {
    # 注意proxy_pass末尾带斜杠,会自动剥离/custom/前缀后转发给后端Django
    proxy_pass http://django_app/;
    proxy_set_header Host $host;   
    proxy_set_header X-Real-IP $remote_addr;        
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 兜底修正后端返回的重定向地址,自动补全/custom前缀
    proxy_redirect ~^(http://[^/]+)/(.*)$ $scheme://$host/custom/$2;
  }
}

配置完成后先执行nginx -t校验配置语法无误,再执行nginx -s reload重载配置即可。

验证点

配置生效后,手动访问以下地址、点击页面内跳转按钮都可以正常访问,不会再出现路径丢失问题:

  • http://demo.company.com/custom/
  • http://demo.company.com/custom/app1
  • http://demo.company.com/custom/app2
  • Django自带的admin后台、登录登出等内置跳转也会自动适配子路径,无需额外修改路由。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 23:21:44