I would just have a middleware look for that header and rewrite
wsgi.url_scheme appropriately in the environment. You could use repoze.vhm
to do that, but since you only need that one tweak, a few lines of
middleware should really be all you need.
key = 'HTTP_X_FORWARDED_PROTO'
def __init__(self, app, global_config, **config):
self.app = app
def __call__(self, environ, start_response):
if self.key in environ:
environ = environ.copy()
environ['wsgi.url_scheme'] = environ[key]
return app(environ, start_response)
On Wed, Nov 10, 2010 at 11:40 AM, Hanno Schlichting <ha...@hannosch.eu>wrote:
> We have an application which supports both HTTP and HTTPS. If the user
> visits the site via https:// he should stay on that protocol and as
> such all links should be generated accordingly.
> We do the SSL handling in Nginx in front of the bfg application. So
> the application always gets a request.application_url with a http://
> link. We have an additional header "'HTTP_X_FORWARDED_PROTO" which
> gets sets to 'https'.
> In order to support this, we use our own route_url function that looks
> like this:
> from repoze.bfg.url import route_url as bfg_route_url
> def route_url(route_name, request, *elements, **kw):
> https = request.environ.get('HTTP_X_FORWARDED_PROTO') == 'https'
> value = bfg_route_url(route_name, request, *elements, **kw)
> if https:
> return value.replace('http://', 'https://')
> return value
> Does this sound like a reasonable approach, or is there a better
> alternative? Having to use a different implementation of a core API
> feels wrong.
> Repoze-dev mailing list
Repoze-dev mailing list