2014-04-28 10 views
14

Ho esattamente lo stesso problema descritto in this SO question and answer. La risposta a questa domanda è un bel lavoro, ma non capisco il problema fondamentale. Terminare SSL al servizio di bilanciamento del carico e utilizzare HTTP tra il servizio di bilanciamento del carico e i server web/app è molto comune. Quale pezzo della pila non sta rispettando l'X-Forwarded-Proto? È werkzeug? Pallone? uwsgi?X-Forwarded-Proto e Flask

Nel mio caso sto usando un ELB AWS (che imposta X-Forwarded-Proto) => Nginx (che inoltra lungo X-Forwarded-Proto a uwsgi). Ma nell'app python devo sottoclasse la richiesta di flask come descritto nella domanda che ho citato sopra.

Poiché si tratta di uno scenario di distribuzione così comune, sembra che ci dovrebbe essere una soluzione migliore. Cosa mi manca?

risposta

24

Manca lo ProxyFix() middleware component. Vedere il pallone Proxy Setups documentation.

Non è necessario sottoclasse nulla; è sufficiente aggiungere il componente middleware per il tuo stack WSGI:

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


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

Se avete installato Flask, avete Werkzeug troppo.

Questo componente sets the WSGI scheme from the X-Forwarded-Proto header. Leggete la documentazione di Flask che vi ho collegato sopra riguardo alle intestazioni fidate e sulla personalizzazione del middleware per la vostra situazione specifica.

+0

Rannuato in questo problema, nel mio ambiente di sviluppo utilizzando Apache come proxy inverso, X-Forwarded-Proto è stato trasmesso e rispettato correttamente ... in prod, ELB stava passando l'intestazione correttamente ma per qualche motivo non funzionava (ancora non sono sicuro del perché) ma ProxyFix ha risolto il problema. – daveruinseverything

+0

Questa è un'ottima informazione! Ma sono ancora curioso di sapere "Quale pezzo della pila non rispetta l'X-Forwarded-Proto? È werkzeug? Flask? Uwsgi?" Oppure l'intestazione X-Forwarded-Proto non dovrebbe essere "rispettata" a meno che non specifichiamo che esiste un proxy fidato che sta scrivendo quelle intestazioni? –

+1

@NealGokli: il secondo. Chiunque sia su Internet potrebbe impostare quell'intestazione. –