最近把用django写的网站部署到nginx反向代理后,其他都没什么问题,使用架构类似这样:
用户–>nginx(hostname1)–>nginx(hostname2)–>gunicorn(django)
django网站一般使用的是相对地址,也就是“/blog/zhangnq”格式,所以一般都不会有什么问题。但是当使用HttpResponsePermanentRedirect方法进行网址重定向的时候发现绝对地址中的hostname错了,应该访问http://hostname1/blog/zhangnq的地址,最后变成了http://hostname2/blog/zhangnq 。
nginx配置
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
个人博客坚持更新不易 留言支持下 加油
谢谢支持。