Your achievements

Level 1

0% to

Level 2

Tip /
Sign in

Sign in to Community

to gain points, level up, and earn exciting badges like the new
Bedrock Mission!

Learn more

View all

Sign in to view all badges

SOLVED

Duplicate page for locale pages while using sling:alias property

sachinn20956098
Level 2
Level 2

We have locale specific pages and we are using sling:alias property to have language specific page name . But the problem is both the urls are publicly accessible : 1) with sling:alias name 2) with original page name.

Example :

page is /content/brand/de/home.html

          -> This home page node has been set a sling:alias property of "zuhause"

Ideally end user should be seeing the page URL : /content/brand/de/zuhause.html

But currently both the urls are serving the content : /content/brand/de/home.html  and /content/brand/de/zuhause.html

How to block the original page url and serve only the locale specific (with sling:alias) url  ?

1 Accepted Solution
Jörg_Hoh
Correct answer by
Employee
Employee

Well, technically it's just an alias, so both ways are ok to use.

If I understand you correctly, you would like to have the page available only via it's alias, not with it's "real" name. You could implement a request filter, which checks if the requested resource is requested via it's real name and then do a redirect to its alias'ed name (or just return a 404 ...). Shouldn't be a big problem to implement that. And of course adapting the linkrewriter to only use the alias when building links.

On the other hand it find it always quite useful if I can just take the URL in the browser and look up that name in the content tree (CRXDE); that's getting harder if you only use aliases.

Jörg

View solution in original post

4 Replies
Arun_Patidar
Community Advisor
Community Advisor

Hi,

You can block/redirect url either by server redirect or AEM sling:mapping.

You may also be interested to check URL Rewriting section at below:

SEO and URL Management Best Practices

Jörg_Hoh
Correct answer by
Employee
Employee

Well, technically it's just an alias, so both ways are ok to use.

If I understand you correctly, you would like to have the page available only via it's alias, not with it's "real" name. You could implement a request filter, which checks if the requested resource is requested via it's real name and then do a redirect to its alias'ed name (or just return a 404 ...). Shouldn't be a big problem to implement that. And of course adapting the linkrewriter to only use the alias when building links.

On the other hand it find it always quite useful if I can just take the URL in the browser and look up that name in the content tree (CRXDE); that's getting harder if you only use aliases.

Jörg

View solution in original post

sachinn20956098
Level 2
Level 2

Thanks Jörg !

I tried implementing a Custom Filter to achieve this functionality , but I am facing an issue : Request and Response objects are of type org.apache.sling.i18n.impl.I18NFilter$I18NSlingHttpServletRequest and they can not be cast to SlingHttpServletRequest and this request type is not an instance of SlingHttpServletRequest.

I tried ranking this custom filter higher than the CQ i18n filter but that is not helping.

@Service(Servlet.class)

@SlingFilter(

        label = "Custom Redirect Filter",

        description = "Custom Utility Redirect Filter",

        metatype = false,

        generateComponent = true,

        generateService = true,

        order = 100,

        scope = SlingFilterScope.REQUEST)

public class CustomRedirectFilter implements Filter {

    private static final org.slf4j.Logger log = LoggerFactory.getLogger(CustomRedirectFilter.class.getName());

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {

       

    }

    @Override

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

    if (!(request instanceof SlingHttpServletRequest)) {

chain.doFilter(request, response);

return;

}

  

    log.info("============================================================");

    log.info("Inside custom redirect filter");

    log.info("============================================================");

        final SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;

        final SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;

       

        final Resource resource = slingRequest.getResource();

        if(resource.getResourceType().equals("cq:Page"))

        {

         PageManager pageManager =  resource.getResourceResolver().adaptTo(PageManager.class);

         Page page = pageManager.getPage(resource.getPath());

         String templatePath =  page.getContentResource().getValueMap().get("cq:template").toString();

         if(templatePath.equals("/apps/custom/test-com/templates/default"))

         {

        slingResponse.setStatus(HttpServletResponse.SC_OK);

        slingResponse.setHeader("Location", "/content/test-com/en/error-404.html");

             slingResponse.setHeader("Connection", "close");

             return;

          }

        }

      

       chain.doFilter(slingRequest, slingResponse);

    }

    @Override

    public void destroy() {

      

    }

}

Jörg_Hoh
Employee
Employee

The request and response object are inheriting from HttpServletRequestWrapper and HttpServletResponseWrapper which have a getResource() method.

Check:

sling-org-apache-sling-i18n/I18NFilter.java at 5db7d6143e16e6a9da27ccbb6c71165b0ea7f5e8 · apache/sli...