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