阿小信大人的头像
Where there is a Python, there is a way. 阿小信大人

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

Nginx配置了https请求后,用户发起https请求时首先和Nginx建立连接,完成SSL握手,而后Nginx作为代理是以http协议将请求转给gunicorn处理的,Nginx再把gunicorn的输出通过SSL加密发回给用户,这中间是透明的,gunicorn只是在处理http请求而已。

这时即使请求时用的是https,flask中的request中wsgi.url_scheme收到的仍然是http,所以在其他url相关的地方的值都是http链接。

解决办法是在flask中使用ProxyFix,并且确保nginx配置中设置了HostX-Forwarded-Proto

flask修改:

from flask import Flask
from werkzeug.contrib.fixers import ProxyFix

app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app)

Nginx配置:

location / {
    proxy_pass http://your_upstream/;
    proxy_set_header   Host             $host;
    proxy_set_header   X-Forwarded-Proto  $scheme;
}

参考文档:

https://groups.google.com/forum/#!topic/pocoo-libs/KAle_rNC1V8

http://docs.jinkan.org/docs/flask/deploying/wsgi-standalone.html#deploying-proxy-setups

http://werkzeug.pocoo.org/docs/contrib/fixers/#werkzeug.contrib.fixers.ProxyFix

https://github.com/mitsuhiko/werkzeug/blob/master/werkzeug/contrib/fixers.py#L81

如果您觉得从我的分享中得到了帮助,并且希望我的博客持续发展下去,请点击支付宝捐赠,谢谢!

若非特别声明,文章均为阿小信的个人笔记,转载请注明出处。文章如有侵权内容,请联系我,我会及时删除。

#Python#   #flask
分享到:
阅读[945] 评论[0]

你可能也感兴趣的文章推荐

本文最近访客

发表评论