From 85ffb3c6789c1920b2aa913be873363ddfc57dbc Mon Sep 17 00:00:00 2001 From: Fabrice Lebas Date: Mon, 21 Sep 2015 14:07:20 +0200 Subject: [PATCH] Allow redirects on the path ignoring parameters. If a redirect entry contains old_path: /path/to/page new_path /page/to/redirect_page and settings.REDIRECT_IGNORE_PARAMETERS is True Then /path/to/page?x=1 will be redirected to /path/to/redirect_page?x=1 --- django/contrib/redirects/middleware.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/django/contrib/redirects/middleware.py b/django/contrib/redirects/middleware.py index dc8d94bc967d..ae9323400c1d 100644 --- a/django/contrib/redirects/middleware.py +++ b/django/contrib/redirects/middleware.py @@ -34,6 +34,15 @@ def process_response(self, request, response): r = Redirect.objects.get(site=current_site, old_path=full_path) except Redirect.DoesNotExist: pass + params = None + if settings.REDIRECT_IGNORE_PARAMETERS and r is None: + path_len = len(request.path) + path = full_path[:path_len] + try: + r = Redirect.objects.get(site=current_site, old_path=path) + params = full_path[path_len:] + except Redirect.DoesNotExist: + pass if r is None and settings.APPEND_SLASH and not request.path.endswith('/'): try: r = Redirect.objects.get( @@ -45,6 +54,8 @@ def process_response(self, request, response): if r is not None: if r.new_path == '': return self.response_gone_class() + elif params is not None: + return self.response_redirect_class("%s%s"%(r.new_path,params)) return self.response_redirect_class(r.new_path) # No redirect was found. Return the response.