如何在AEM / CQ中添加robots.txt文件?

时间:2017-10-25 11:38:51

标签: aem cq5 aem-6

如何将robots.txt文件添加到AEM服务器以为AEM中的Web爬虫提供规则?

1 个答案:

答案 0 :(得分:1)

大多数人会引用This Link 实现这一点。

虽然它似乎可以达到目的但你会注意到一件事可能有些“不对”。

直接在crxde中添加robots.txt文件会导致在根级别创建类型为nt:file的节点。

因此当您点击http://localhost:4502/robots.txt而不是在屏幕/浏览器上显示时,文件会下载。

这是因为默认GET servlet 。 servlet标识节点类型为nt:file,并发送内容类型为

的响应
Content-Type: application/octet-stream
Content-Disposition: attachment;filename=robots.txt

为了克服这个过程,过滤器如下。通过这样做,您将跳过对Sling的默认GET Servlet的调用,并且能够提供您自己的内容类型。

 package com.hds.exp.filters;

import org.apache.felix.scr.annotations.sling.SlingFilter;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

import org.apache.felix.scr.annotations.Properties;
import org.apache.felix.scr.annotations.Property;

@SlingFilter(order=1)
@Properties({
    @Property(name="service.pid", value="com.hds.exp.filters.RobotsFilter",propertyPrivate=false),
    @Property(name="service.description",value="Provides Robots.txt", propertyPrivate=false),
    @Property(name="service.vendor",value="DD Exp", propertyPrivate=false),
    @Property(name="pattern",value="/.*", propertyPrivate=false)    
})
public class RobotsFilter implements javax.servlet.Filter{

    @Override
    public void destroy() {
        // Unused
    }

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

        HttpServletRequest httpServletRequest =(HttpServletRequest) request;
        if(httpServletRequest.getRequestURI().equals("/robots.txt"))
        {
            response.setContentType("text/plain");
            PrintWriter writer = response.getWriter();
            writer.print("User-agent: *");
            writer.print("\n");
            writer.print("Disallow: /");
            writer.print("\n");
            writer.flush();
        }
        else
        {
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig arg0) throws ServletException {
        // Unused
    }

}