Amazon web services 阻止API网关接收robots.txt文件的请求

Amazon web services 阻止API网关接收robots.txt文件的请求,amazon-web-services,robots.txt,aws-api-gateway,Amazon Web Services,Robots.txt,Aws Api Gateway,我一直在从事一个新项目,该项目利用映射到lambda函数的API网关。lambda函数包含一个Kestrel.NET web服务器,该服务器通过API网关通过代理接收请求。我已将API网关重新映射到实际子域,以确保某种品牌一致性。一切正常;然而,我最近实现了Elmah.IO,以便更好地了解在这种不寻常的情况下会出现哪些错误 现在,每天大约有一到五次,api网关URL收到一个无法完成的robots.txt文件请求。我不希望API能够完成这个请求,因为API不是用来服务静态内容的。我的问题是,;我如

我一直在从事一个新项目,该项目利用映射到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响应动态生成我的文本文件。我在以下网站上阅读了这篇文章:

这给了我动态生成请求的想法。因此,我设立了以下机构:

[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? 网络爬虫寻找他们能找到的任何URL,并对所有内容进行索引。如果在任何地方都有对API网关URL的引用,谷歌机器人及其朋友很可能会找到它。他们没有任何理由预先知道域仅用于编程访问,从他们的角度来看,API URL和其他URL一样

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

我如何防止这些请求被提出? 我不想告诉人们他们问错了问题,但你真的希望爬虫来问。这就是你如何告诉爬虫你不希望他们请求的其他页面。robots.txt约定的目的是,它被认为是一种向爬虫传达你的愿望的简单方式。在web的早期,将文本文件放入根文件夹非常容易。随着web的发展,站点更多地由程序驱动,而不是文件驱动,因此该约定更难处理。但是你不能真正阻止爬虫请求robots.txt,因为在他们处理之前,他们无法知道是否应该点击该主机名上的其他URL,所以他们总是会尝试请求它。你只需要处理它

是否有一些配置可以添加到我的Web API中,以强制对robots.txt请求的设计进行文本响应? 以下是我为API网关创建robots.txt的步骤:

  • 使用名称
    robots.txt
    和路径
    robots.txt
    创建一个新资源。请注意,控制台将尝试在默认情况下将路径设置为
    robots txt
    (改为使用连字符),因此您需要确保对其进行更改

  • 为该资源创建一个新方法,例如GET

  • 选择模拟的集成类型

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

  • 返回并打开“方法响应”部分。展开状态200部分,单击铅笔图标编辑
    应用程序/json
    响应主体类型。将其更改为
    text/plain
    ,然后单击复选标记保存

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

  • 我预计大多数API系统都希望使用:


    您好,我尝试了您的建议,但在方法响应中没有application/json或pencil。我不能添加响应主体,因为我必须为它定义一个模型???@StefanPeter:我已经添加了我所做的一步一步的屏幕截图。希望能有帮助。哇,彼得,谢谢你的努力。但我的网关有一点不同。在方法执行方面;没有http响应。只是空的。我可以添加一个200的响应,但是我不能添加一个主体,因为它需要一个模型,我没有,也不知道它应该是什么样子@史蒂芬彼得:我不知道该告诉你什么…我拍了那些截图,创建了一个全新的API。200人的反应已经出现了;我刚换了。当然有可能,我在一些我不记得的地方更改了一些设置,但如果是这样,我,嗯,不记得这样做过。也许不同地区的情况不同?如果有帮助的话,我现在在美国东部一号工作。在多年回避这个话题之后,我不得不再次回到这个话题上来现在我知道为什么这种方法对我不起作用了。因为我们在api网关中将lambda函数与此代理路径一起使用。任何
    User-agent: *
    Disallow: /