1. 首页
  2. 运维开发
  3. Python

Django部署多个nginx反向代理后hostname获取错误的问题

最近把用django写的网站部署到nginx反向代理后,其他都没什么问题,使用架构类似这样:

用户–>nginx(hostname1)–>nginx(hostname2)–>gunicorn(django)

django网站一般使用的是相对地址,也就是“/blog/zhangnq”格式,所以一般都不会有什么问题。但是当使用HttpResponsePermanentRedirect方法进行网址重定向的时候发现绝对地址中的hostname错了,应该访问http://hostname1/blog/zhangnq的地址,最后变成了http://hostname2/blog/zhangnq 。

nginx配置

20191124223700

proxy_set_header Host "hostname2";
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
                
proxy_pass http://1.1.1.1 ;

当用户访问hostname1访问,nginx代理请求1.1.1.1服务器servername是hostname2的站点,但是X-Forwarded-Host传递的是hostname1。

默认情况下,Django会忽略所有X-Forwarded标头,也就是说django服务器get_host方法获取到的http_host是hostname2。 如前所述的问题,那么我们可以通过设置USE_X_FORWARDED_HOST = True来将get_host设置为读取X-Forwarded-Host标头。

打开django项目settings.py文件,修改或添加如下行:

USE_X_FORWARDED_HOST = True

更改这个设置后,django重定向运行正常,问题解决。

参考网址:https://ubuntu.com/blog/django-behind-a-proxy-fixing-absolute-urls

2 评论
内联反馈
查看所有评论
软件帝
4 年 前

个人博客坚持更新不易 留言支持下 加油

联系我们

0574-55011290

QQ:248687950

邮件:admin@nbhao.org

工作时间:周一至周五,9:00-18:00,节假日休息

QR code