Skip to main content
This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
lukasz-m
lukasz-mAccepted solution
Community Advisor
February 4, 2023

Hi @garrettshue,

This is possible, you have a look on below options:

  • Apache rewrite map - https://httpd.apache.org/docs/current/rewrite/rewritemap.html
  • Redirect Map Manager form ACS Commons - https://adobe-consulting-services.github.io/acs-aem-commons/features/redirect-map-manager/index.html
  • Finally you can write your own Sling Filter. Below is very simple example, that will redirect you from /document/adobe.pdf to /content/dam/wknd/en/adobefile.pdf. I have tested it on clear AEM 6.5.13 - and it works without any issue. Of course you will need to manage list of redirect somehow, but there are many options, e.g. CA Configuration, Metadata schema etc
    package com.example.filters;
    
    import org.apache.sling.api.SlingHttpServletRequest;
    import org.apache.sling.api.SlingHttpServletResponse;
    import org.apache.sling.api.servlets.HttpConstants;
    import org.apache.sling.engine.EngineConstants;
    import org.osgi.framework.Constants;
    import org.osgi.service.component.annotations.Component;
    
    import javax.servlet.*;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    @Component(service = Filter.class, immediate = true, property = {
            EngineConstants.SLING_FILTER_SCOPE + "=" + EngineConstants.FILTER_SCOPE_REQUEST,
            EngineConstants.SLING_FILTER_METHODS + "=" + HttpConstants.METHOD_GET,
            Constants.SERVICE_RANKING + "=" + Integer.MAX_VALUE
    })
    public class RedirectFilter implements Filter {
    
        private Map<String, String> redirectMap = new HashMap<String, String>();
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            redirectMap.put("/document/adobe.pdf", "/content/dam/wknd/en/adobefile.pdf");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) servletRequest;
            SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) servletResponse;
    
            String path = slingRequest.getRequestPathInfo().getResourcePath();
            if (redirectMap.containsKey(slingRequest.getRequestPathInfo().getResourcePath())) {
                slingResponse.sendRedirect(redirectMap.get(path));
                return;
            }
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        @Override
        public void destroy() {
        }
    }
    

2 replies

lukasz-m
Community Advisor
lukasz-mCommunity AdvisorAccepted solution
Community Advisor
February 4, 2023

Hi @garrettshue,

This is possible, you have a look on below options:

  • Apache rewrite map - https://httpd.apache.org/docs/current/rewrite/rewritemap.html
  • Redirect Map Manager form ACS Commons - https://adobe-consulting-services.github.io/acs-aem-commons/features/redirect-map-manager/index.html
  • Finally you can write your own Sling Filter. Below is very simple example, that will redirect you from /document/adobe.pdf to /content/dam/wknd/en/adobefile.pdf. I have tested it on clear AEM 6.5.13 - and it works without any issue. Of course you will need to manage list of redirect somehow, but there are many options, e.g. CA Configuration, Metadata schema etc
    package com.example.filters;
    
    import org.apache.sling.api.SlingHttpServletRequest;
    import org.apache.sling.api.SlingHttpServletResponse;
    import org.apache.sling.api.servlets.HttpConstants;
    import org.apache.sling.engine.EngineConstants;
    import org.osgi.framework.Constants;
    import org.osgi.service.component.annotations.Component;
    
    import javax.servlet.*;
    import java.io.IOException;
    import java.util.HashMap;
    import java.util.Map;
    
    @Component(service = Filter.class, immediate = true, property = {
            EngineConstants.SLING_FILTER_SCOPE + "=" + EngineConstants.FILTER_SCOPE_REQUEST,
            EngineConstants.SLING_FILTER_METHODS + "=" + HttpConstants.METHOD_GET,
            Constants.SERVICE_RANKING + "=" + Integer.MAX_VALUE
    })
    public class RedirectFilter implements Filter {
    
        private Map<String, String> redirectMap = new HashMap<String, String>();
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            redirectMap.put("/document/adobe.pdf", "/content/dam/wknd/en/adobefile.pdf");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) servletRequest;
            SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) servletResponse;
    
            String path = slingRequest.getRequestPathInfo().getResourcePath();
            if (redirectMap.containsKey(slingRequest.getRequestPathInfo().getResourcePath())) {
                slingResponse.sendRedirect(redirectMap.get(path));
                return;
            }
            filterChain.doFilter(servletRequest, servletResponse);
        }
    
        @Override
        public void destroy() {
        }
    }
    
Translate
Ritesh_Mittal
Adobe Champion and Community Advisor
Adobe Champion and Community Advisor
February 4, 2023

Hi @garrettshue ,

 

 

 

Though we can write redirects but curious to know if we are talking about only 10 PDFs then why don't we replace them with correct files. Redirects can be seen on browser and redirecting one pdf URL to another one is not a good user experience.

 

Unless those URLs are bookmarked ones.

 

Thanks,

Ritesh Mittal

Translate