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.

Reply via email to