Expand my Community achievements bar.

July 31st AEM Gems Webinar: Elevate your AEM development to master the integration of private GitHub repositories within AEM Cloud Manager.
SOLVED

\/content/dam assets - adding a meta robots tag

Avatar

Level 2

Hi everyone,

We are trying to add the option of making specific folder paths within our DAM non-indexable. Currently, we are handling via robots.txt but wanted to see the alternatives specifically for assets. We do have the functionality set up for pages but I couldn't seem to find anything for specific DAM content. Any insight would be greatly appreciated. Thank you.

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

Hi @asdasdsa 
You can use sling filters to add the X-Robots-Tag header with the value noindex, nofollow for specific DAM folders 


Sling Filter

package com.example.core.filters;

import org.apache.commons.lang3.StringUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.engine.EngineConstants;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component(service = Filter.class,
    property = {
        EngineConstants.SLING_FILTER_SCOPE + "=" + EngineConstants.FILTER_SCOPE_REQUEST,
        Constants.SERVICE_RANKING + "=1000"
    })
public class XRobotsTagFilter implements Filter {

    private static final Logger log = LoggerFactory.getLogger(XRobotsTagFilter.class);
    private static final String X_ROBOTS_TAG = "X-Robots-Tag";
    private static final String NOINDEX_NOFOLLOW = "noindex, nofollow";
    private static final String[] DAM_FOLDERS = {"/content/dam/folder1", "/content/dam/folder2"};

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // Initialization logic, if needed
    }

    @Override
    public void doFilter(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        if (request instanceof SlingHttpServletRequest && response instanceof SlingHttpServletResponse) {
            SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
            SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;
            ResourceResolver resourceResolver = slingRequest.getResourceResolver();
            String requestPath = slingRequest.getRequestURI();

            for (String folder : DAM_FOLDERS) {
                if (StringUtils.startsWith(requestPath, folder)) {
                    slingResponse.setHeader(X_ROBOTS_TAG, NOINDEX_NOFOLLOW);
                    log.debug("Added X-Robots-Tag header to the response for path: {}", requestPath);
                    break;
                }
            }
        }

        // Continue the filter chain
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // Cleanup logic, if needed
    }
}

 

Config. , example osgi

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.metatype.annotations.Designate;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;

@Component(service = Filter.class,
    property = {
        EngineConstants.SLING_FILTER_SCOPE + "=" + EngineConstants.FILTER_SCOPE_REQUEST,
        Constants.SERVICE_RANKING + "=1000"
    })
@Designate(ocd = XRobotsTagFilter.Config.class)
public class XRobotsTagFilter implements Filter {

    @ObjectClassDefinition(name = "X-Robots-Tag Filter Configuration")
    public @interface Config {
        String[] dam_folders() default {"/content/dam/folder1", "/content/dam/folder2"};
    }

    private String[] damFolders;

    @Activate
    protected void activate(Config config) {
        this.damFolders = config.dam_folders();
    }

    // Rest of the code remains the same
}

  



Arun Patidar

View solution in original post

3 Replies

Avatar

Correct answer by
Community Advisor

Hi @asdasdsa 
You can use sling filters to add the X-Robots-Tag header with the value noindex, nofollow for specific DAM folders 


Sling Filter

package com.example.core.filters;

import org.apache.commons.lang3.StringUtils;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.engine.EngineConstants;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.framework.Constants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@Component(service = Filter.class,
    property = {
        EngineConstants.SLING_FILTER_SCOPE + "=" + EngineConstants.FILTER_SCOPE_REQUEST,
        Constants.SERVICE_RANKING + "=1000"
    })
public class XRobotsTagFilter implements Filter {

    private static final Logger log = LoggerFactory.getLogger(XRobotsTagFilter.class);
    private static final String X_ROBOTS_TAG = "X-Robots-Tag";
    private static final String NOINDEX_NOFOLLOW = "noindex, nofollow";
    private static final String[] DAM_FOLDERS = {"/content/dam/folder1", "/content/dam/folder2"};

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // Initialization logic, if needed
    }

    @Override
    public void doFilter(javax.servlet.ServletRequest request, javax.servlet.ServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        if (request instanceof SlingHttpServletRequest && response instanceof SlingHttpServletResponse) {
            SlingHttpServletRequest slingRequest = (SlingHttpServletRequest) request;
            SlingHttpServletResponse slingResponse = (SlingHttpServletResponse) response;
            ResourceResolver resourceResolver = slingRequest.getResourceResolver();
            String requestPath = slingRequest.getRequestURI();

            for (String folder : DAM_FOLDERS) {
                if (StringUtils.startsWith(requestPath, folder)) {
                    slingResponse.setHeader(X_ROBOTS_TAG, NOINDEX_NOFOLLOW);
                    log.debug("Added X-Robots-Tag header to the response for path: {}", requestPath);
                    break;
                }
            }
        }

        // Continue the filter chain
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // Cleanup logic, if needed
    }
}

 

Config. , example osgi

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.metatype.annotations.Designate;
import org.osgi.service.metatype.annotations.ObjectClassDefinition;

@Component(service = Filter.class,
    property = {
        EngineConstants.SLING_FILTER_SCOPE + "=" + EngineConstants.FILTER_SCOPE_REQUEST,
        Constants.SERVICE_RANKING + "=1000"
    })
@Designate(ocd = XRobotsTagFilter.Config.class)
public class XRobotsTagFilter implements Filter {

    @ObjectClassDefinition(name = "X-Robots-Tag Filter Configuration")
    public @interface Config {
        String[] dam_folders() default {"/content/dam/folder1", "/content/dam/folder2"};
    }

    private String[] damFolders;

    @Activate
    protected void activate(Config config) {
        this.damFolders = config.dam_folders();
    }

    // Rest of the code remains the same
}

  



Arun Patidar