如何将 robots.txt 文件添加到 AEM 服务器以为 AEM 中的 Web 爬虫提供规则?
问问题
2645 次
1 回答
1
大多数你会参考这个链接 来实现这个。
尽管它似乎可以达到目的,但您会注意到一件可能有点“不正确”的事情。
直接在 crxde 中添加 robots.txt 文件会导致在根级别创建 nt:file 类型的节点。
因此,当您点击http://localhost:4502/robots.txt而不是在屏幕/浏览器上显示文件时,文件就会下载。
这是因为Default GET servlet。servlet 识别节点类型为 nt:file 并发送内容类型为的响应
Content-Type: application/octet-stream
Content-Disposition: attachment;filename=robots.txt
为了克服这个问题,请按如下方式实施过滤器。通过这样做,您将跳过对 Sling 的 Default 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
}
}
于 2017-10-25T11:38:50.527 回答