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

I. *_*han 4 robots.txt amazon-web-services aws-api-gateway

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

现在,每天大约一到五次,api 网关 URL 收到无法完成的 robots.txt 文件的请求。我不希望 API 能够完成这个请求,因为 API 不是为了提供静态内容。我的问题是;如何防止提出这些请求?

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

小智 9

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

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

行为良好的网络爬虫会在请求任何其他内容之前请求域的 robots.txt 文件,以查看它们是否应该加载域上的任何其他页面。

如何防止这些请求被提出?

不想告诉人们他们问错了问题,但实际上您希望爬虫提出请求。这就是您可以告诉抓取工具您希望他们请求的其他页面的方式。robots.txt 约定的目的是它应该是一种向爬虫传达您的愿望的简单方法。在 Web 的早期,将文本文件放入根文件夹非常容易。随着网络的发展,站点更多地由程序驱动而不是文件驱动,因此约定有点难以处理。但你真的下来请求 robots.txt 的爬虫,因为在处理它之前,它们无法知道是否应该访问该主机名上的其他 URL,因此它们总是会尝试请求它。你只需要处理它。

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

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

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

    创建资源

    设置资源名称

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

    创建方法

    新方法用于 GET

  3. 选择 Mock 的集成类型。

    集成类型是 Mock

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

    转到集成响应部分

    展开状态 200

    展开身体映射模板

    编辑应用程序/json

    更改内容类型,包括 robots.txt 内容,然后保存

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

    转到方法响应部分

    展开状态 200 的部分

    点击铅笔进行编辑

    更改为文本/纯文本并保存

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

¹ 我希望大多数 API 系统都希望使用标准方法来排除所有机器人

User-agent: *
Disallow: /
Run Code Online (Sandbox Code Playgroud)

  • 在回避这个话题多年之后,我不得不再次回到这个话题。:) 现在我知道为什么这里的方法对我不起作用。因为我们在 api 网关中使用带有此代理路径的 lambda 函数。任何请求都会发送到 lambda 函数。我们的解决方案是从 lambda 函数返回 robots.txt 内容。但是我们在 api 网关中有多个阶段,因此有多个基本路径映射,因此我们不允许将空的基本路径映射到阶段,以便它可以处理请求。:( (2认同)

I. *_*han 2

经过一番研究后,我最终尝试动态生成 robots.txt 响应的文本文件。我正在阅读这篇文章:http://rehansaeed.com/dynamically-generate-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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 也许你应该使用 `disallow: /` (https://www.robotstxt.org/robotstxt.html) (3认同)