阻止API Gateway接收robots.txt文件的请求

时间:2017-04-05 19:25:17

标签: amazon-web-services robots.txt aws-api-gateway

我一直在研究一个利用映射到lambda函数的API网关的新项目。 lambda函数包含一个Kestrel .NET Web服务器,它通过API Gateway通过代理接收请求。我已将API网关重新映射到实际的子域,以确保一些品牌一致性。一切都很好;但是,我最近实施了Elmah.IO,以便更好地了解在这种不寻常的环境中出现的错误。

现在,每天大约一到五次,api网关URL正在请求无法完成的robots.txt文件。我不希望API能够完成此请求,因为API不是为了提供静态内容。我的问题是;我怎样才能阻止这些请求的发生呢?

是什么原因导致请求API网关URL?是因为它是通过我的主机网站的链接直接检测到的吗?它使用CORS来访问API,因此机器人可能会将API检测为完全独立的域并尝试抓取它。如果是这样,是否有一些配置我可以添加到我的Web API以强制我的设计文本响应robots.txt请求?

2 个答案:

答案 0 :(得分:3)

是什么原因导致请求API网关URL?

网络抓取工具会查找他们可以找到的任何网址,并希望将所有网址编入索引。如果在任何地方都有对您的API网关URL的引用,则可能是Googlebot并且其朋友会找到它。他们没有任何理由提前知道某个域只适用于编程访问,从他们的角度来看,API URL就像其他任何URL一样。

行为良好的网络抓取工具会在请求其他任何内容之前请求域的robots.txt文件,以查看他们是否应该加载域中的任何其他网页。

如何防止发出这些请求?

我讨厌告诉别人他们问的是错误的问题,但实际上你希望抓取工具来请求它。这就是你如何告诉抓取者你不希望他们要求的其他页面。 robots.txt惯例的目的是,它应该是一种简单的方式将您的愿望传达给爬虫。在Web的早期阶段,将文本文件放入根文件夹非常容易。随着Web的发展,站点的编程驱动程度更高,而不是文件驱动,因此约定难度较大。但你不能真正停止抓取者请求robots.txt,因为他们无法知道他们是否应该在该主机名上点击其他网址,直到他们处理它为止,所以他们总是会去尝试请求它。你只需要处理它。

是否有一些配置可以添加到我的Web API中以强制我的设计对robots.txt请求进行文本响应?

以下是我为API网关创建robots.txt所采取的步骤:

  1. 创建名为robots.txt和路径robots.txt的新资源。请注意,默认情况下,控制台将尝试将路径设为robots-txt(使用连字符),因此您需要确保更改它。

    Create Resource

    Set Resource Name

  2. 为GET创建该资源的新方法。

    Create Method

    New Method is for GET

  3. 选择模拟的集成类型。

    Integration type is Mock

  4. 在“集成响应”部分中,展开状态200部分,展开“正文映射模板”部分,然后单击application/json。将内容类型更改为text/plain,并将所需的robots.txt内容¹放在模板框中。单击“保存”。

    Go to Integration Response section

    Expand status 200

    Expand Body Mapping Templates

    Edit application/json

    Change content type, include robots.txt content, and Save

  5. 返回并打开“方法响应”部分。展开状态200的部分,单击铅笔图标以编辑application/json响应正文类型。将其更改为text/plain,然后点击复选标记进行保存。

    Go to Method Response section

    Expand section for status 200

    Click pencil to edit

    Change to text/plain and Save

  6. 重复步骤2到5,但是对于HEAD而不是GET。 (我相信在使用GET获取文件之前,可能会有机器人用HEAD检查是否存在。)看起来您需要在模板框中放入相同的robots.txt内容,即使响应实际上不会被发送对于HEAD请求,要发送正确的Content-Length标头。
  7. 部署到测试阶段,并确保robots.txt网址正常运行,并以HEAD和GET的text/plain内容类型进行响应。
  8. 准备好后部署到您的生产阶段。
  9. ¹我希望大多数API系统都想使用standard method to exclude all robots

    User-agent: *
    Disallow: /
    

答案 1 :(得分:1)

在研究了一下之后,我最终只是尝试动态生成robots.txt响应的文本文件。我正在阅读文章:http://rehansaeed.com/dynamically-generating-robots-txt-using-asp-net-mvc/

这让我有了动态生成请求的想法。因此,我设置了以下内容:

[Route("/")]
public class ServerController : Controller
{
    [HttpGet("robots.txt")]
    public ContentResult GetRobotsFile()
    {
        StringBuilder stringBuilder = new StringBuilder();

        stringBuilder.AppendLine("user-agent: *");
        stringBuilder.AppendLine("disallow: *");

        return this.Content(stringBuilder.ToString(), "text/plain", Encoding.UTF8);
    }
}