Flask url_for generating http URL instead of https

后端 未结 6 2035
醉梦人生
醉梦人生 2020-11-28 07:29

I am using url_for to generate a redirect URL when a user has logged out:

return redirect(url_for(\'.index\', _external=True))

6条回答
  •  庸人自扰
    2020-11-28 07:57

    For anyone ending up here recently there is an official uwsgi fixer for this: https://stackoverflow.com/a/23504684/13777925

    FWIW this still didn't work for me since the header wasn't being set correctly so I augmented the ReversedProxied middleware to prefer https if found thusly:

    class ReverseProxied(object):
    """
    Because we are reverse proxied from an aws load balancer
    use environ/config to signal https
    since flask ignores preferred_url_scheme in url_for calls
    """
    
        def __init__(self, app):
            self.app = app
    
        def __call__(self, environ, start_response):
            # if one of x_forwarded or preferred_url is https, prefer it.
            forwarded_scheme = environ.get("HTTP_X_FORWARDED_PROTO", None)
            preferred_scheme = app.config.get("PREFERRED_URL_SCHEME", None)
            if "https" in [forwarded_scheme, preferred_scheme]:
                environ["wsgi.url_scheme"] = "https"
            return self.app(environ, start_response)
    

    Called as:

    app = flask.Flask(__name__)
    app.wsgi_app = ReverseProxied(app.wsgi_app)
    

    This way if you've set the environment var "PREFERRED_URL_SCHEME" explicitly or if the nginx/etc/proxy sets the X_FORWARDED_PROTO, it does the right thing.

提交回复
热议问题