Nginx配置了https请求后,用户发起https请求时首先和Nginx创建链接,完成SSL握手,然后Nginx做为代理是以http协议将请求转给gunicorn处理的,Nginx再把gunicorn的输出经过SSL加密发回给用户,这中间是透明的,gunicorn只是在处理http请求而已。html
这时即便请求时用的是https,flask中的request中wsgi.url_scheme
收到的仍然是http,因此在其余url相关的地方的值都是http连接。nginx
解决办法是在flask中使用ProxyFix,而且确保nginx配置中设置了Host
和X-Forwarded-Proto
git
flask修改:github
from flask import Flask from werkzeug.contrib.fixers import ProxyFix app = Flask(__name__) app.wsgi_app = ProxyFix(app.wsgi_app)
Nginx配置:flask
location / { proxy_pass http://your_upstream/; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme; }
参考文档:app
https://groups.google.com/forum/#!topic/pocoo-libs/KAle_rNC1V8google
http://docs.jinkan.org/docs/flask/deploying/wsgi-standalone.html#deploying-proxy-setups加密
http://werkzeug.pocoo.org/docs/contrib/fixers/#werkzeug.contrib.fixers.ProxyFixurl
https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/contrib/fixers.py#L81spa