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

相關文章
相關標籤/搜索