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

问题描述 投票:0回答:2

我一直在开发一个新项目,该项目利用映射到 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 请求进行文本响应?

amazon-web-services robots.txt aws-api-gateway
2个回答
16
投票

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

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

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

如何阻止提出这些请求?

我不想告诉人们他们问了错误的问题,但实际上你想要爬虫提出请求。这就是您如何告诉爬虫您“不”希望他们请求的其他页面。 robots.txt 约定的目的是,它应该是一种向爬虫传达您的愿望的简单方法。在网络的早期,将文本文件放入根文件夹非常容易。随着网络的发展,网站更多地以编程方式驱动,而不是文件驱动,因此该约定有点难以处理。但你无法真正“阻止”爬虫请求 robots.txt,因为它们在处理该主机名之前无法知道是否应该访问该主机名上的其他 URL,因此它们总是会尝试请求它。你只需要处理它。 我可以在 Web API 中添加一些配置来强制我的设计对 robots.txt 请求进行文本响应吗? 以下是我为 API 网关创建 robots.txt 所采取的步骤:

创建一个新资源,名称为

robots.txt
    ,路径为
  1. robots.txt

    。请注意,默认情况下,控制台将尝试将路径设置为

    robots-txt
    (改为连字符),因此您需要确保更改它。
    
    

    Create Resource

    Set Resource Name为该资源创建一个新方法,用于 GET。

  2. Create Method

    New Method is for GET选择模拟的集成类型。

  3. Integration type is Mock在“Integration Response”部分中,展开状态 200 的部分,展开“Body Mapping Templates”部分,然后单击

    application/json
  4. 。将内容类型更改为
  5. 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返回并打开“方法响应”部分。展开状态 200 的部分,单击铅笔图标以编辑

    application/json
  6. 响应正文类型。将其更改为
  7. text/plain

    ,然后单击复选标记保存。

    
    

    Go to Method Response section

    Expand section for status 200

    Click pencil to edit

    Change to text/plain and Save重复步骤 2 到 5,但使用 HEAD 而不是 GET。 (我相信可能有机器人在使用 GET 获取文件之前使用 HEAD 检查是否存在。)看起来您需要将相同的 robots.txt 内容放入模板框中,即使响应实际上不会发送对于 HEAD 请求,发送正确的 Content-Length 标头。

    部署到您的测试阶段,并确保 robots.txt URL 正常工作,并以
  8. text/plain
  9. HEAD 和 GET 的内容类型进行响应。
  10. 准备好后部署到生产阶段。
    
    
    
  11. ¹ 我预计大多数 API 系统都希望使用
  12. 标准方法来排除所有机器人
:

User-agent: * Disallow: /

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

2
投票

这给了我动态生成请求的想法。 因此,我设置了以下内容: [Route("/")] public class ServerController : Controller { [HttpGet("robots.txt")] public ContentResult GetRobotsFile() { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("user-agent: *"); stringBuilder.AppendLine("disallow: /"); // this will disallow all routes return this.Content(stringBuilder.ToString(), "text/plain", Encoding.UTF8); } }

© www.soinside.com 2019 - 2024. All rights reserved.