Nginx location块配置子路径转发Django应用跳转丢前缀解决方法
问题根因
跳转丢失/custom前缀的核心原因是仅在Nginx层做了路径重写,Django服务本身完全感知不到自己被部署在子路径下:Django的路由反向解析、重定向响应、模板内链接生成全默认以根路径/为基准,最终返回给浏览器的页面里所有跳转链接都是/app1这类不带子路径前缀的地址,点击后浏览器直接请求根路径下的路由,自然触发404。
可行配置方案
需要同时调整Django侧和Nginx侧配置,从根源解决路径生成问题,不要仅靠Nginx rewrite硬改入站路径。
- 调整Django配置
编辑项目的settings.py,添加子路径前缀配置,同时修正静态资源路径:
# settings.py # 告诉Django所有生成的URL统一带上/custom前缀 FORCE_SCRIPT_NAME = '/custom' # 修正静态资源路径前缀,避免静态资源加载404 STATIC_URL = '/custom/static/'
配置完成后重启Gunicorn/uWSGI等Django运行进程,此时模板内{% url %}标签、redirect()跳转函数生成的所有站内链接都会自动携带/custom前缀,不会再出现路径丢失问题。
- 调整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/app1http://demo.company.com/custom/app2- Django自带的admin后台、登录登出等内置跳转也会自动适配子路径,无需额外修改路由。
内容的提问来源于stack exchange,提问作者Mohammad Saad
相关产品推荐
相关产品推荐

