From 1de40dd85e42367fa17918bb527706782e48488e Mon Sep 17 00:00:00 2001 From: Julien Castiaux Date: Tue, 10 May 2022 09:33:04 +0000 Subject: [PATCH] [FIX] website: wrong canonical URL after reroute A reroute in an internal redirection, the URL on the current request is changed. The actual changes occurs on the "WSGI environment", a dictionnary that is populated with the request information by the WSGI server (werkzeug in our case). Among all the properties there are PATH_INFO, RAW_URI and REQUEST_URI. * PATH_INFO is the standard value, it contains a RFC-3986 path. `request.httprequest.path` is based on that value. * RAW_URI and REQUEST_PATH are two custom values set by werkzeug to mimic other popular wsgi servers (gunicorn, uwsgi, mod_wsgi), they also only contain a RFC-3986 path. When rerouting only PATH_INFO and RAW_URI are updated. REQUEST_URI is left as-is in order to keep the original path somewhere. When building the cannonical path, one must use the original path instead of the rerouted one. X-original-commit: 779486c4dff23b946b4b14e3dca164ecca4f85a8 Part-of: odoo/odoo#91034 --- addons/website/models/website.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/website/models/website.py b/addons/website/models/website.py index db6c8c632d0..595c58c7d50 100644 --- a/addons/website/models/website.py +++ b/addons/website/models/website.py @@ -1312,12 +1312,13 @@ class Website(models.Model): router = http.root.get_db_router(request.db).bind('') path = router.build(rule.endpoint, args) + if lang != self.default_lang_id: + path = f'/{lang.url_code}{path}' except (NotFound, AccessError, MissingError): # The build method returns a quoted URL so convert in this case for consistency. - path = urls.url_quote_plus(request.httprequest.path, safe='/') - lang_path = f'/{lang.url_code}' if lang != self.default_lang_id else '' + path = urls.url_quote_plus(request.httprequest.environ['REQUEST_URI'], safe='/') canonical_query_string = f'?{urls.url_encode(canonical_params)}' if canonical_params else '' - return self.get_base_url() + lang_path + path + canonical_query_string + return self.get_base_url() + path + canonical_query_string def _get_canonical_url(self, canonical_params): """Returns the canonical URL for the current request."""