Author: gabrielhurley Date: 2010-11-07 17:03:47 -0600 (Sun, 07 Nov 2010) New Revision: 14494
Modified: django/branches/releases/1.2.X/docs/ref/request-response.txt Log: [1.2.X] Fixed #11877 -- Documented that HttpRequest.get_host() fails behind multiple reverse proxies, and added an example middleware solution. Thanks to Tom Evans for the report, and arnav for the patch. Backport of [14493] from trunk. Modified: django/branches/releases/1.2.X/docs/ref/request-response.txt =================================================================== --- django/branches/releases/1.2.X/docs/ref/request-response.txt 2010-11-07 23:02:24 UTC (rev 14493) +++ django/branches/releases/1.2.X/docs/ref/request-response.txt 2010-11-07 23:03:47 UTC (rev 14494) @@ -189,17 +189,40 @@ .. method:: HttpRequest.get_host() - .. versionadded:: 1.0 + .. versionadded:: 1.0 - Returns the originating host of the request using information from the - ``HTTP_X_FORWARDED_HOST`` and ``HTTP_HOST`` headers (in that order). If - they don't provide a value, the method uses a combination of - ``SERVER_NAME`` and ``SERVER_PORT`` as detailed in `PEP 333`_. + Returns the originating host of the request using information from the + ``HTTP_X_FORWARDED_HOST`` and ``HTTP_HOST`` headers (in that order). If + they don't provide a value, the method uses a combination of + ``SERVER_NAME`` and ``SERVER_PORT`` as detailed in `PEP 333`_. - .. _PEP 333: http://www.python.org/dev/peps/pep-0333/ + .. _PEP 333: http://www.python.org/dev/peps/pep-0333/ - Example: ``"127.0.0.1:8000"`` + Example: ``"127.0.0.1:8000"`` + .. note:: The :meth:`~HttpRequest.get_host()` method fails when the host is + behind multiple proxies. One solution is to use middleware to rewrite + the proxy headers, as in the following example:: + + class MultipleProxyMiddleware(object): + FORWARDED_FOR_FIELDS = [ + 'HTTP_X_FORWARDED_FOR', + 'HTTP_X_FORWARDED_HOST', + 'HTTP_X_FORWARDED_SERVER', + ] + + def process_request(self, request): + """ + Rewrites the proxy headers so that only the most + recent proxy is used. + """ + for field in self.FORWARDED_FOR_FIELDS: + if field in request.META: + if ',' in request.META[field]: + parts = request.META[field].split(',') + request.META[field] = parts[-1].strip() + + .. method:: HttpRequest.get_full_path() Returns the ``path``, plus an appended query string, if applicable. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To post to this group, send email to django-upda...@googlegroups.com. To unsubscribe from this group, send email to django-updates+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/django-updates?hl=en.