diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py index f110da79145..ea24ddabcd9 100644 --- a/addons/website/models/ir_http.py +++ b/addons/website/models/ir_http.py @@ -265,13 +265,22 @@ class Http(models.AbstractModel): @classmethod def _serve_page(cls): req_page = request.httprequest.path - page_domain = [('url', '=', req_page)] + request.website.website_domain() - published_domain = page_domain + def _search_page(comparator='='): + page_domain = [('url', comparator, req_page)] + request.website.website_domain() + return request.env['website.page'].sudo().search(page_domain, order='website_id asc', limit=1) + # specific page first - page = request.env['website.page'].sudo().search(published_domain, order='website_id asc', limit=1) + page = _search_page() - # redirect withtout trailing / + # case insensitive search + if not page: + page = _search_page('=ilike') + if page: + logger.info("Page %r not found, redirecting to existing page %r", req_page, page.url) + return request.redirect(page.url) + + # redirect without trailing / if not page and req_page != "/" and req_page.endswith("/"): # mimick `_postprocess_args()` redirect path = request.httprequest.path[:-1] diff --git a/addons/website/tests/test_page.py b/addons/website/tests/test_page.py index e3673cfbabc..fdb121489ae 100644 --- a/addons/website/tests/test_page.py +++ b/addons/website/tests/test_page.py @@ -483,3 +483,10 @@ class WithContext(HttpCase): # Check that is is rendered as a website page. self.assertEqual(403, r.status_code, "Must fail with 403") self.assertTrue('id="wrap"' in r.text, "Must be rendered as a website page") + + def test_page_url_case_insensitive_match(self): + r = self.url_open('/page_1') + self.assertEqual(r.status_code, 200, "Reaching page URL, common case") + r2 = self.url_open('/Page_1', allow_redirects=False) + self.assertEqual(r2.status_code, 303, "URL exists only in different casing, should redirect to it") + self.assertTrue(r2.headers.get('Location').endswith('/page_1'), "Should redirect /Page_1 to /page_1")