阻止 API 网关接收对 robots.txt 文件的请求

Prevent API Gateway from receiving requests for a robots.txt file

我一直在开发一个新项目,该项目利用映射到 lambda 函数的 API 网关。 lambda 函数包含一个 Kestrel .NET Web 服务器,该服务器通过代理通过 API 网关接收请求。我已将 API 网关重新映射到实际的子域,以确保某种品牌一致性。一切正常;但是,我最近实施了 Elmah.IO 以便更好地了解在这种不寻常的情况下会出现什么错误。

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

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

经过一番研究后,我最终只是尝试为 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);
    }
}

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

Web 爬虫会寻找它们可以找到的任何 URLs 并希望为所有内容编制索引。如果在任何地方都有对您的 API 网关 URL 的引用,Googlebot 及其朋友很可能会找到它。他们没有任何理由事先知道域仅用于编程访问,从他们的角度来看 API URL 与其他域一样只是 URL。

Well-behaved 网络爬虫将在请求其他任何内容之前请求域的 robots.txt 文件,以查看它们是否应该加载域中的任何其他页面。

如何防止发出这些请求?

我不想告诉人们他们问错了问题,但实际上您希望 爬虫请求它。这就是您可以告诉爬虫您不希望它们请求的其他页面的方法。 robots.txt 约定的目的是它应该是一种将您的愿望传达给爬虫的简单方法。在网络的早期,将文本文件放入根文件夹非常容易。随着网络的发展,站点更多的是 programmatically-driven 而不是 file-driven,因此约定有点难以处理。但是你真的不能 阻止 爬虫请求 robots.txt 因为他们无法知道他们是否应该点击该主机名上的其他 URL 直到他们处理它,所以他们总是会尝试请求它。你只需要处理它。

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

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

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

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

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

  4. 在 "Integration Response" 部分中,展开状态 200 部分,展开 "Body Mapping Templates" 部分,然后单击 application/json。将内容类型更改为 text/plain,然后将所需的 robots.txt 内容¹ 放入模板框中。单击保存。

  5. 返回并打开"Method Response"部分。展开状态 200 的部分,单击铅笔图标以编辑 application/json 响应 body 类型。将其更改为 text/plain,然后单击复选标记以保存。

  6. 重复步骤 2 到 5,但针对 HEAD 而不是 GET。 (我相信可能会有机器人在使用 GET 获取文件之前使用 HEAD 检查是否存在。)看起来你需要在模板框中放置相同的 robots.txt 内容,即使响应实际上不会发送 HEAD 请求,以发送正确的 Content-Length header。
  7. 部署到您的测试阶段,并确保 robots.txt URL 正常工作,并以 text/plain Content-Type 响应 HEAD 和 GET。
  8. 准备就绪后部署到您的生产阶段。

¹ 我预计大多数 API 系统都希望使用 standard method to exclude all robots:

User-agent: *
Disallow: /