Hi, I'm using AEM version 6.2 and I've override the error handler and created the custom error handler. Inside the custom error handler, added the use of custom ErrorHandler model instead of using OOTB one.
Custom 404.html code:
<html data-sly-use.responseStatus="com.sample.ResponseStatus">
<head>
<title>File not found</title>
</head>
<body>
<p>A custom errorhandler for 404 responses</p>
</body>
</html>
When I hit the URL with resource that doesn't exist in AEM and URL contains .html extension then the control comes in custom 404.html and invokes the model which internally include the 404 error page and displays the result.
But, if I do hit the page without .html extension then it displays error message which is in the custom 404.html.
Not sure if control is actually coming to the custom 404.html 'cos if it comes then it should've invoke the model and displayed 404 page which it displays with .html extension.
Any suggestions?
Regards,
Vijay
Solved! Go to Solution.
Hi Vijay,
You are returning 404 resource which doesn't have html extension. add .html at the end and then check
Please do like below:
<sly data-sly-resource="{responseStatus.pageNotFound}.html" />
Hi Vijay,
How did you included your 404 page inside 404.html?
I tried in 6.3 with below and working in both the scenario
<
article
data-sly-resource
=
"path/to/resource"
></
article
>
Views
Replies
Total Likes
Hi Arun , Thanks for responding . 404 page is getting triggered from the model. Below is the code snippet
public class ResponseStatus extends WCMUsePojo {
private static final String DIR_404_HTML = "/404";
private static final String CONTENT_SAMPLE = "/content/sample/";
private static final String AUTHOR = "author";
private static final String EN_US = "en-us";
private static final Pattern REGEX_LANGUAGE_SELECTOR = Pattern
.compile("(/content/myproject)?/([a-zA-Z]{2}-[a-zA-Z]{2})");
private static final Logger log = LoggerFactory.getLogger(ResponseStatus.class);
private static final int ERROR_CODE_404 = 404;
@Override
public void activate() throws Exception {
Set<String> runModes;
SlingSettingsService slingSettings = this.getSlingScriptHelper().getService(SlingSettingsService.class);
if (null != slingSettings) {
runModes = slingSettings.getRunModes();
getResponse().setStatus(ERROR_CODE_404);
if (!runModes.contains(AUTHOR)) {
String requestUrl = getRequest().getRequestURL().toString();
if (StringUtils.isNotEmpty(requestUrl)) {
String languageCode = setLanguageCode(requestUrl);
redirectToErrorPage(languageCode);
}
}
}
}
protected void redirectToErrorPage(String languageCode) throws IOException {
String redirectUrl = CONTENT_SAMPLE + languageCode + DIR_404_HTML;
ResourceResolver resolver = getRequest().getResourceResolver();
Resource targetResource = resolver.getResource(redirectUrl);
if (targetResource != null) {
try {
RequestDispatcher dispatcher = getRequest().getRequestDispatcher(targetResource);
if (dispatcher != null) {
dispatcher.include(getRequest(), getResponse());
}
} catch (ServletException e) {
log.error("Error while forwarding the requesting {}", e);
}
} else {
log.info("404 Page not found {}", redirectUrl);
}
}
/**
* Returns the languageCode of the request URL
*/
private String setLanguageCode(String requestUrl) {
String language = EN_US;
String path = getPath(requestUrl);
if (path != null) {
Matcher languageMatcher = REGEX_LANGUAGE_SELECTOR.matcher(path);
if (languageMatcher.find()) {
language = languageMatcher.group(2);
}
}
return language;
}
private static String getPath(String uri)
{
String path = null;
try {
URI url = new URI(uri);
path = url.getPath();
} catch (URISyntaxException e) {
log.error("Could not process uri {}", uri, e);
}
return path;
}
}
Thanks
Views
Replies
Total Likes
Hi,
I tried same and its look like when you include resource other than html, it is not including response in the page. I checked using filter as well but there is no request for 404 page if there is no extension.
The reason could be there is no script to render other than html e.g. my component.html
you may try to create servlet and read response and then include in the page, kind of indirect. or you can change your strategy and do redirect to actual 404 pages from 404.html.
Hi, Thanks for your response. We don't want to do the redirect to 404 page so can't go with that option. About the servlet part, I didn't get how it'll be triggered if we're going to hit the page without extension? If I write a servlet based on resource type 'sling/servlet/deafult' but then again, it's going to required to have extension to call it. How can I achieve this scenario? Could you please explain? Regards, Vijay
Views
Replies
Total Likes
Hi,
Vijay, instead of doing dispatcher.include(getRequest(), getResponse()), you can return the 404 page URL from the ResponseStatus class and you can include resource directly in Sightly using data-sly-resource or data-sly-include.
I guess the reason the 404 page is not invoked might be due to AEM server returning 403 status for folders.
Please following URL, this may help you - https://www.albinsblog.com/2018/07/how-to-display-custom-site-specific-error-pages-in-aem.html#.W5_Y...
Views
Replies
Total Likes
Hi Arun, As suggested, I've modifide the java code to get the resource path and then render it in 404.html using data-sly-resource. I'm getting the resource path from Error Model but I'm trying to render the in 404.html, it's only working for .html pages but not for extensionless pages. <!-- --!> Thanks, Vijay.
Views
Replies
Total Likes
Hi Vijay,
You are returning 404 resource which doesn't have html extension. add .html at the end and then check
Please do like below:
<sly data-sly-resource="{responseStatus.pageNotFound}.html" />
Thanks a lot Arun your help is greatly appreciated . At last usecase is working as expected.
Views
Replies
Total Likes