This is an automated email from the ASF dual-hosted git repository.

mridulpathak pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new c27b22af66 Fixed: Keep the redirection of a path alias to its aliasTo 
on the web site (OFBIZ-13645)
c27b22af66 is described below

commit c27b22af66e82c085c8b0486138b228a73eff3dc
Author: Mridul Pathak <[email protected]>
AuthorDate: Sun Oct 4 14:32:10 2026 +0530

    Fixed: Keep the redirection of a path alias to its aliasTo on the web site 
(OFBIZ-13645)
    
    When a WebSitePathAlias with an aliasTo is requested, CmsEvents.cms 
redirects to a location built from the context path, the servlet path, the 
hosted path alias, the request URI that the client sent without its last 
segment, and the aliasTo. That request URI is not normalized, so when the web 
application is mounted on the root a request whose URI starts with two slashes 
gave a location that starts with two slashes, which a browser follows to 
another host.
    
    The location is now built in CmsEvents.getAliasRedirectLocation, which 
always returns a path on the web site, with a single leading slash, and without 
any control character, such as a line break, that would end the header. The 
locations of the redirections that were already working are unchanged.
---
 .../org/apache/ofbiz/content/cms/CmsEvents.java    | 37 +++++++++++++++++-----
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git 
a/applications/content/src/main/java/org/apache/ofbiz/content/cms/CmsEvents.java
 
b/applications/content/src/main/java/org/apache/ofbiz/content/cms/CmsEvents.java
index 9b1b251b65..668998087d 100644
--- 
a/applications/content/src/main/java/org/apache/ofbiz/content/cms/CmsEvents.java
+++ 
b/applications/content/src/main/java/org/apache/ofbiz/content/cms/CmsEvents.java
@@ -61,6 +61,31 @@ public final class CmsEvents {
     private CmsEvents() {
     }
 
+    /**
+     * Builds the location a path alias is redirected to: the context path, 
the servlet path, the hosted path alias if there is
+     * one, the part of the request URI before the last segment, and the alias 
the path is redirected to.
+     * The request URI is the one the client sent and it is not normalized, so 
it can start with two slashes, for example
+     * //example.com/.. when the web application is mounted on the root, and a 
browser takes a location that starts with two
+     * slashes as another host. The location is therefore always a path on 
this site, and it never contains a control character,
+     * such as a line break, which would end the header.
+     * @param context the context path of the request
+     * @param servletPath the servlet path of the request
+     * @param hostedPathAlias the hosted path alias of the web site, or null
+     * @param requestUri the request URI
+     * @param alias the path to redirect to, starting with a slash
+     * @return the location to redirect to
+     */
+    static String getAliasRedirectLocation(String context, String servletPath, 
String hostedPathAlias, String requestUri,
+            String alias) {
+        String location = context + servletPath;
+        if (hostedPathAlias != null) {
+            location += "/" + hostedPathAlias;
+        }
+        String uri = requestUri.substring(context.length());
+        uri = uri.substring(0, uri.lastIndexOf('/'));
+        return "/" + (location + uri + alias).replaceAll("\\p{Cntrl}", 
"").replaceFirst("^[/\\\\]+", "");
+    }
+
     public static String cms(HttpServletRequest request, HttpServletResponse 
response) {
         Delegator delegator = (Delegator) request.getAttribute("delegator");
         LocalDispatcher dispatcher = (LocalDispatcher) 
request.getAttribute("dispatcher");
@@ -181,19 +206,15 @@ public final class CmsEvents {
                             alias = "/" + alias;
                         }
 
-                        String context = request.getContextPath();
-                        String location = context + request.getServletPath();
                         GenericValue webSite = 
WebSiteWorker.getWebSite(request);
+                        String hostedPathAlias = null;
                         if (webSite != null && 
webSite.getString("hostedPathAlias") != null && !"ROOT".equals(pathInfo)) {
-                            location += "/" + 
webSite.getString("hostedPathAlias");
+                            hostedPathAlias = 
webSite.getString("hostedPathAlias");
                         }
 
-                        String uriWithContext = request.getRequestURI();
-                        String uri = 
uriWithContext.substring(context.length());
-                        uri = uri.substring(0, uri.lastIndexOf('/'));
-
                         
response.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
-                        response.setHeader("Location", location + uri + alias);
+                        response.setHeader("Location", 
getAliasRedirectLocation(request.getContextPath(), request.getServletPath(),
+                                hostedPathAlias, request.getRequestURI(), 
alias));
                         response.setHeader("Connection", "close");
 
                         return null; // null to not process any views

Reply via email to