Expand my Community achievements bar.

Radically easy to access on brand approved content for distribution and omnichannel performant delivery. AEM Assets Content Hub and Dynamic Media with OpenAPI capabilities is now GA.
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