diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py
index bb5522fcdec348b721f6a4b6c417548688a0e1d3..aa072912b3116277d228099c2fd50c4f818e82ed 100644
--- a/addons/http_routing/models/ir_http.py
+++ b/addons/http_routing/models/ir_http.py
@@ -16,7 +16,7 @@ except ImportError:
     slugify_lib = None
 
 import odoo
-from odoo import api, models, registry, exceptions
+from odoo import api, models, registry, exceptions, tools
 from odoo.addons.base.models.ir_http import RequestUID, ModelConverter
 from odoo.addons.base.models.qweb import QWebException
 from odoo.http import request
@@ -31,7 +31,6 @@ _logger = logging.getLogger(__name__)
 # This avoids blowing up open files limit
 odoo._geoip_resolver = None
 
-
 # ------------------------------------------------------------
 # Slug API
 # ------------------------------------------------------------
@@ -186,24 +185,17 @@ def url_for(url_from, lang_code=None, no_rewrite=False):
     if not getattr(request.env['ir.http'], '_rewrite_len', {}).get(routing):
         no_rewrite = True
 
-    # avoid useless check for 1 char URL '/', '#', ... and absolute URL
-    if not no_rewrite and url_from and (len(url_from) > 1 or not url_from.startswith('http')):
-        path, _, qs = url_from.partition('?')
-        req = request.httprequest
-        router = req.app.get_db_router(request.db).bind('')
-        try:
-            _ = router.match(path, method='POST')
-        except werkzeug.exceptions.MethodNotAllowed as e:
-            _ = router.match(path, method='GET')
-        except werkzeug.routing.RequestRedirect as e:
-            # remove query string from current env
-            new_url = e.new_url.split('?')[0]
-            # remove scheme and add query_string from url_from
-            new_url = new_url[7:] + (qs and '?%s' % qs or '')
-        except werkzeug.exceptions.NotFound as e:
-            new_url = url_from
-        except Exception as e:
-            raise e
+    path, _, qs = (url_from or '').partition('?')
+
+    if (not no_rewrite and path and (
+            len(path) > 1
+            and path.startswith('/')
+            and '/static/' not in path
+            and not path.startswith('/web/')
+    )):
+        new_url = request.env['ir.http'].url_rewrite(path)
+        new_url = new_url and qs and new_url + '?%s' % qs
+
 
     return url_lang(new_url or url_from, lang_code=lang_code)
 
@@ -661,3 +653,22 @@ class IrHttp(models.AbstractModel):
                 code, html = 418, env['ir.ui.view']._render_template('http_routing.http_error', values)
 
         return werkzeug.wrappers.Response(html, status=code, content_type='text/html;charset=utf-8')
+
+    @api.model
+    @tools.ormcache('path')
+    def url_rewrite(self, path):
+        new_url = False
+        req = request.httprequest
+        router = req.app.get_db_router(request.db).bind('')
+        try:
+            _ = router.match(path, method='POST')
+        except werkzeug.exceptions.MethodNotAllowed as e:
+            _ = router.match(path, method='GET')
+        except werkzeug.routing.RequestRedirect as e:
+            new_url = e.new_url[7:]  # remove scheme
+        except werkzeug.exceptions.NotFound as e:
+            new_url = path
+        except Exception as e:
+            raise e
+
+        return new_url or path