将flask+gunicorn+nginx从http升级到https后出现了一个奇怪的现象:程序逻辑是用户没有登录则重定向到用户登录页面。重定向使用的是 redirect(url_for('login')),然后浏览器返回的是网关页面或者路由器配置页面。通过调试发现,请求url正确,但是响应的ip变成了客户端请求的ip,不再是服务器的域名或者ip。而http升级到https使用了代理,设置几个头文件出现的这个问题。
解决办法:
1. 通过改代码,将url_for使用绝对路径:
url_for('login', _external=True) # 设置_external为True,则使用绝对路径
2. 改nginx的配置文件,经过测试发现是 proxy_set_header X-Forwarded-Host $remote_addr; 的问题:
# proxy_set_header X-Forwarded-Host $remote_addr; # 注释这行后测试通过,本人按这种方式改的
or
proxy_set_header X-Forwarded-Host $host; # 理论是可行的,未测试