[fix] reverse proxy non-root url fix
This commit is contained in:
		
							parent
							
								
									b73ac15e49
								
							
						
					
					
						commit
						6ef7c3276c
					
				| @ -781,10 +781,45 @@ def run(): | ||||
|     ) | ||||
| 
 | ||||
| 
 | ||||
| class ReverseProxyPathFix(object): | ||||
|     '''Wrap the application in this middleware and configure the | ||||
|     front-end server to add these headers, to let you quietly bind | ||||
|     this to a URL other than / and to an HTTP scheme that is | ||||
|     different than what is used locally. | ||||
| 
 | ||||
|     http://flask.pocoo.org/snippets/35/ | ||||
| 
 | ||||
|     In nginx: | ||||
|     location /myprefix { | ||||
|         proxy_pass http://127.0.0.1:8000; | ||||
|         proxy_set_header Host $host; | ||||
|         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; | ||||
|         proxy_set_header X-Scheme $scheme; | ||||
|         proxy_set_header X-Script-Name /myprefix; | ||||
|         } | ||||
| 
 | ||||
|     :param app: the WSGI application | ||||
|     ''' | ||||
|     def __init__(self, app): | ||||
|         self.app = app | ||||
| 
 | ||||
|     def __call__(self, environ, start_response): | ||||
|         script_name = environ.get('HTTP_X_SCRIPT_NAME', '') | ||||
|         if script_name: | ||||
|             environ['SCRIPT_NAME'] = script_name | ||||
|             path_info = environ['PATH_INFO'] | ||||
|             if path_info.startswith(script_name): | ||||
|                 environ['PATH_INFO'] = path_info[len(script_name):] | ||||
| 
 | ||||
|         scheme = environ.get('HTTP_X_SCHEME', '') | ||||
|         if scheme: | ||||
|             environ['wsgi.url_scheme'] = scheme | ||||
|         return self.app(environ, start_response) | ||||
| 
 | ||||
| 
 | ||||
| application = app | ||||
| 
 | ||||
| app.wsgi_app = ProxyFix(application.wsgi_app) | ||||
| 
 | ||||
| # patch app to handle non root url-s behind proxy & wsgi | ||||
| app.wsgi_app = ReverseProxyPathFix(ProxyFix(application.wsgi_app)) | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     run() | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user