Expand my Community achievements bar.

Disable .html extension check in AEM linkchecker

Avatar

Level 2

There are some external links which don't have .html extension but they are opening fine in chrome and edge browser, when they are authored in AEM components like RTE, linkchecker is making GET call and marking that link as invalid because it doesn't have .html extension. Now it is showing like broken link on pages. My question - is there anyway to bypass html extension check in aem external link checker using config settings ? or we would require custom linkchecker. Do we need any dispatcher changes to achieve this? 
Expected outcome- Even I author external link without .html or any other extension it should open. 

Topics

Topics help categorize Community content and increase your ability to discover relevant content.

1 Reply

Avatar

Community Advisor

Hi @tejaswi_aem,

You can customize the requirement as below:

Step 1: Refined URIUtils Class
package com.ontariohealth.core.utils;

import org.apache.commons.lang3.StringUtils;

public final class URIUtils {
    private URIUtils() {}

    public static String normalizeLink(String uri) {
        return StringUtils.isNotBlank(uri) ? processUri(uri) : uri;
    }

    public static String processUri(String uri) {
        if (StringUtils.startsWith(uri, "/content/")) {
            return processContentUri(uri);
        } else {
            if (StringUtils.startsWith(uri, "www")) return addHttpPrefix(uri);
            return uri;
        }
    }

    public static String processContentUri(String uri) {
        String extension = getExtension(uri);

        if (StringUtils.isBlank(extension) ||
            !StringUtils.equalsAnyIgnoreCase(extension, "json", "html", "en")) {

            if (uri.contains("?")) {
                uri = uri.replace("?", ".html?");
            } else if (uri.contains("#")) {
                uri = uri.replace("#", ".html#");
            } else {
                uri += ".html";
            }
        }

        return uri;
    }

    public static String addHttpPrefix(String uri) {
        return StringUtils.startsWithAnyIgnoreCase(uri, "http://", "https://") ? uri : "https://" + uri;
    }

    public static String getExtension(String uri) {
        String path = uri.split("\\?")[0].split("#")[0];
        int lastDot = path.lastIndexOf(".");
        return lastDot != -1 ? path.substring(lastDot + 1) : "";
    }
}
Step 2: Sling Model to Expose Normalized Link to HTL
package com.ontariohealth.core.models;

import com.ontariohealth.core.utils.URIUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.models.annotations.DefaultInjectionStrategy;
import org.apache.sling.models.annotations.Model;
import org.apache.sling.models.annotations.injectorspecific.ValueMapValue;

import javax.annotation.PostConstruct;

@Model(adaptables = Resource.class, defaultInjectionStrategy = DefaultInjectionStrategy.OPTIONAL)
public class LinkModel {

    @ValueMapValue
    private String link;

    private String normalizedLink;

    @PostConstruct
    protected void init() {
        if (StringUtils.isNotBlank(link)) {
            normalizedLink = URIUtils.normalizeLink(link);
        }
    }

    public String getLink() {
        return normalizedLink;
    }
}
Step 3: HTL Use in a Component
<a href="${model.link}" target="_blank">${model.link}</a>

Make sure to use data-sly-use.model="com.ontariohealth.core.models.LinkModel" in your component.

Step 4: Disable AEM Link Checker for External Links (via OSGi)

Create this config at:

/apps/your-project/config.author/com.day.cq.rewriter.linkchecker.impl.LinkCheckerTransformerFactory.config
properties
linkcheckertransformer.disableExternal=true

This disables broken link validation on authored external URLs like https://abc.com/testregardless of whether they have .html.

If deploying to AEM as a Cloud Service, this config goes under:

/apps/your-project/osgiconfig/config.author

Santosh Sai

AEM BlogsLinkedIn