flask经过nginx代理后base_url拿不到正确的url_scheme2016-04-14 12:31

http://www.axiaoxin.com/article/210/

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配置中设置了HostX-Forwarded-Protogit

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

相关文章
相关标签/搜索